index.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711
  1. // nova-tourism/components/dev-route/index.js
  2. let Parse = getApp().Parse;
  3. const company = getApp().globalData.company
  4. const uid = Parse.User.current()?.id
  5. const req = require('../../../utils/request')
  6. Component({
  7. /**
  8. * 组件的属性列表
  9. */
  10. properties: {
  11. rid: null, //devRouter的id
  12. object_id: null, //编辑的objcetId
  13. edit_field_map: null, //字段编辑对象
  14. is_btn: null, //是否显示提交按钮(save当前对象)
  15. },
  16. /**
  17. * 组件的初始数据
  18. */
  19. data: {
  20. color: '#46a9a4', //主题色
  21. text_color: 'black', //文字颜色
  22. editMap: {},
  23. editFields: [], //编辑对象列表
  24. isShowPointer: false, //指针弹框
  25. pointerList: [], //指针列表
  26. pointer_val: null, //搜索指针的关键字
  27. fieldIndex: null, //当前操作的编辑对象index
  28. timeout: null, //指针搜索框计时器
  29. is_btn: null, //是否显示提交按钮(save当前对象)
  30. queryParamsData: null, //当前编辑的对象(不存在则 new)
  31. },
  32. lifetimes: {
  33. detached: function () {},
  34. attached: async function () {
  35. this.getToken()
  36. setTimeout(() => {
  37. this.refersh()
  38. }, 800);
  39. },
  40. },
  41. /**
  42. * 组件的方法列表
  43. */
  44. methods: {
  45. async refersh() {
  46. let {
  47. is_btn
  48. } = this.properties
  49. this.setData({
  50. is_btn
  51. })
  52. await this.getDevRoute()
  53. this.getDataItem()
  54. },
  55. /**获取devRoute */
  56. async getDevRoute() {
  57. let {
  58. rid,
  59. edit_field_map
  60. } = this.properties
  61. console.log(edit_field_map)
  62. let query = new Parse.Query('DevRoute')
  63. let d = await query.get(rid)
  64. let devRoute = d?.toJSON()
  65. console.log(devRoute)
  66. let editMap = {}
  67. let editFieldsList = []
  68. for (let i in devRoute?.editFields) {
  69. let item = devRoute?.editFields[i]
  70. if (item.key in edit_field_map) { //如果当前字段存在于父组件传递的默认编辑字段之内
  71. if (('isHide' in edit_field_map[item.key]) && edit_field_map[item.key]['isHide']) {} else { //排除isHide为true的字段,其他字段使用父组件默认编辑
  72. for (let map_key in edit_field_map[item.key]) {
  73. devRoute.editFields[i][map_key] = edit_field_map[item.key][map_key]
  74. }
  75. editFieldsList.push(devRoute.editFields[i])
  76. editMap[item.key] = {
  77. type: item.type,
  78. val: item.default || null
  79. }
  80. }
  81. } else {
  82. editFieldsList.push(devRoute.editFields[i])
  83. editMap[item.key] = {
  84. type: item.type,
  85. val: item.default || null
  86. }
  87. }
  88. }
  89. console.log(editFieldsList)
  90. this.setData({
  91. devRoute,
  92. className: d?.get('pageUrl')?.split('/')?.pop(),
  93. editFields: editFieldsList,
  94. editMap
  95. })
  96. },
  97. /**获取数据*/
  98. async getDataItem() {
  99. let {
  100. object_id
  101. } = this.properties
  102. if (!object_id) return
  103. let {
  104. className,
  105. editMap,
  106. editFields
  107. } = this.data
  108. let pointerKeys = editFields.filter(item => item.type == 'Pointer' || item.view == 'pointer-array')?.map(item => item.key)
  109. let query = new Parse.Query(className)
  110. for (let i in pointerKeys) {
  111. query.include(pointerKeys[i])
  112. }
  113. let d = await query.get(object_id)
  114. if (!d?.id) return
  115. let dataItem = d?.toJSON()
  116. for (let i in editFields) {
  117. let item = editFields[i]
  118. if (item.view == 'edit-image') {
  119. if (item.type == 'String') { //单张图片
  120. editMap[item.key].val = dataItem[item.key] ? [{
  121. url: dataItem[item.key]
  122. }] : item.default || null
  123. }
  124. if (item.type == 'Array') { //数组图片
  125. if (dataItem[item.key] && dataItem[item.key]?.length > 0) {
  126. editMap[item.key].val = dataItem[item.key]?.map(item => {
  127. return {
  128. url: item
  129. }
  130. })
  131. } else {
  132. editMap[item.key].val = item.default || []
  133. }
  134. }
  135. } else {
  136. if (item.type == 'Pointer') { //指针类型
  137. let text = dataItem[item.key]?.storeName || dataItem[item.key]?.title || dataItem[item.key]?.name || dataItem[item.key]?.orderNum || dataItem[item.key]?.mobile
  138. editMap[item.key].text = text
  139. } else if (item.type == 'Array' && item.view == 'pointer-array') { //数组指针
  140. let text = []
  141. for (let x in dataItem[item.key]) {
  142. let xtem = dataItem[item.key][x]
  143. text.push(xtem?.storeName || xtem?.title || xtem?.name || xtem?.orderNum || xtem?.mobile)
  144. editMap[item.key].text = text
  145. }
  146. }
  147. editMap[item.key].val = dataItem[item.key] || item.default || null
  148. }
  149. }
  150. this.setData({
  151. dataItem,
  152. editMap,
  153. queryParamsData: d
  154. })
  155. },
  156. /** 获取token 上传图片所需*/
  157. async getToken() {
  158. let res = await Parse.Cloud.run('qiniu_uptoken', {
  159. company: company
  160. })
  161. this.setData({
  162. uploadURL: res.zoneUrl,
  163. domain: res.domain,
  164. uptokenURL: res.uptoken,
  165. })
  166. },
  167. /** textarea改变 - String类型*/
  168. changeTextarea(e) {
  169. let {
  170. editMap
  171. } = this.data
  172. console.log(e)
  173. let {
  174. key
  175. } = e.currentTarget.dataset
  176. let {
  177. value
  178. } = e.detail
  179. editMap[key].val = value
  180. this.setData({
  181. editMap
  182. })
  183. },
  184. /**上传单张图片 - String类型 */
  185. changeFile(e) {
  186. console.log(e)
  187. let {
  188. editMap
  189. } = this.data
  190. let {
  191. key
  192. } = e.currentTarget.dataset
  193. console.log(e.detail[0])
  194. editMap[key].val = e.detail
  195. this.setData({
  196. editMap
  197. })
  198. },
  199. /**单选框改变 - String类型 */
  200. radioChange(e) {
  201. console.log(e)
  202. let {
  203. editMap
  204. } = this.data
  205. let {
  206. key
  207. } = e.currentTarget.dataset
  208. editMap[key].val = e.detail
  209. this.setData({
  210. editMap
  211. })
  212. },
  213. /** 数字输入框改变 - Number类型*/
  214. changeNumber(e) {
  215. let {
  216. editMap
  217. } = this.data
  218. console.log(e)
  219. let {
  220. key
  221. } = e.currentTarget.dataset
  222. let {
  223. value
  224. } = e.detail
  225. editMap[key].val = value
  226. this.setData({
  227. editMap
  228. })
  229. },
  230. /**开关改变 */
  231. switchChange(e) {
  232. let {
  233. editMap
  234. } = this.data
  235. console.log(e)
  236. let {
  237. key
  238. } = e.currentTarget.dataset
  239. editMap[key].val = e.detail
  240. this.setData({
  241. editMap
  242. })
  243. },
  244. /**上传多张图片 - Array类型 */
  245. changeFile_array(e) {
  246. console.log(e)
  247. let {
  248. editMap
  249. } = this.data
  250. let {
  251. key
  252. } = e.currentTarget.dataset
  253. editMap[key].val = e.detail
  254. this.setData({
  255. editMap
  256. })
  257. },
  258. /**添加文本 - Array类型 */
  259. addTextarea(e) {
  260. console.log(e)
  261. let {
  262. editMap
  263. } = this.data
  264. let {
  265. key
  266. } = e.currentTarget.dataset
  267. editMap[key].val = [...(editMap[key].val || []), e.detail.value]
  268. this.setData({
  269. editMap
  270. })
  271. },
  272. /**删除文本 - Array类型 */
  273. delTextarea(e) {
  274. console.log(e)
  275. let {
  276. editMap
  277. } = this.data
  278. let {
  279. key,
  280. index
  281. } = e.currentTarget.dataset
  282. editMap[key].val?.splice(index, 1)
  283. this.setData({
  284. editMap
  285. })
  286. },
  287. /**指针弹框-开 */
  288. async openPointer(e) {
  289. let {
  290. editFields
  291. } = this.data
  292. let {
  293. index
  294. } = e.currentTarget.dataset
  295. if (editFields[index].disabled) {
  296. wx.showToast({
  297. title: `无法编辑${editFields[index].name}`,
  298. icon: 'none'
  299. })
  300. return
  301. }
  302. this.setData({
  303. fieldIndex: index,
  304. pointerList: [],
  305. pointer_val: '',
  306. isShowPointer: true
  307. })
  308. this.getPointerItem()
  309. },
  310. /**指针弹框-关 */
  311. closePointer() {
  312. this.setData({
  313. isShowPointer: false
  314. })
  315. },
  316. /**选中指针 */
  317. checkPointer(e) {
  318. let {
  319. editFields, //编辑对象列表
  320. pointerList, //指针列表
  321. fieldIndex, //当前操作的编辑对象index
  322. editMap,
  323. } = this.data
  324. let {
  325. index
  326. } = e.currentTarget.dataset
  327. let editField = editFields[fieldIndex]
  328. let p_item = pointerList[index]
  329. console.log(pointerList)
  330. pointerList = pointerList?.map((item, i) => {
  331. if (i == index) {
  332. item['dev_router_check'] = true
  333. } else {
  334. item['dev_router_check'] = false
  335. }
  336. return item
  337. })
  338. editMap[editField.key].val = {
  339. className: editField?.targetClass,
  340. __type: 'Pointer',
  341. objectId: p_item?.objectId
  342. }
  343. editMap[editField.key].text = p_item.storeName || p_item.name || p_item.title || p_item.orderNum || p_item.mobile
  344. this.setData({
  345. editMap,
  346. pointerList
  347. })
  348. this.closePointer()
  349. },
  350. /**选中指针 - Array */
  351. checkPointer_Array(e) {
  352. let {
  353. editFields, //编辑对象列表
  354. pointerList, //指针列表
  355. fieldIndex, //当前操作的编辑对象index
  356. editMap,
  357. } = this.data
  358. let {
  359. index
  360. } = e.currentTarget.dataset
  361. let editField = editFields[fieldIndex]
  362. let p_item = pointerList[index]
  363. console.log(editField, p_item)
  364. pointerList[index]['dev_router_check'] = !(pointerList[index]['dev_router_check'] || false)
  365. let checkList = pointerList?.filter(item => item.dev_router_check) || []
  366. editMap[editField.key].val = checkList.map(p_item => {
  367. return {
  368. className: editField?.targetClass,
  369. __type: 'Pointer',
  370. objectId: p_item?.objectId
  371. }
  372. })
  373. editMap[editField.key].text = checkList.map(p_item => {
  374. return p_item.storeName || p_item.name || p_item.title || p_item.orderNum || p_item.mobile
  375. })
  376. console.log(editMap)
  377. this.setData({
  378. editMap,
  379. pointerList
  380. })
  381. },
  382. /**删除数组指针 */
  383. delPointer(e) {
  384. console.log(e)
  385. let {
  386. editMap
  387. } = this.data
  388. let {
  389. key,
  390. index
  391. } = e.currentTarget.dataset
  392. editMap[key].text?.splice(index, 1)
  393. editMap[key].val?.splice(index, 1)
  394. this.setData({
  395. editMap
  396. })
  397. },
  398. /**指针搜索框变化 */
  399. async valChange(e) {
  400. await this.setData({
  401. pointer_val: e.detail || ''
  402. })
  403. let {
  404. timeout
  405. } = this.data
  406. clearTimeout(timeout)
  407. timeout = setTimeout(async () => {
  408. await this.setData({
  409. pointerList: [],
  410. })
  411. this.getPointerItem()
  412. }, 1000);
  413. this.setData({
  414. timeout
  415. })
  416. },
  417. /** 查询指针*/
  418. async getPointerItem() {
  419. let {
  420. editMap,
  421. pointer_val,
  422. pointerList,
  423. fieldIndex,
  424. editFields
  425. } = this.data
  426. let editField = editFields[fieldIndex]
  427. let sql = `SELECT DISTINCT(column_name) FROM information_schema.columns
  428. WHERE table_name = '${editField.targetClass}'`
  429. let columnList = await req.customSQL(sql)
  430. let where = {
  431. "$or": []
  432. }
  433. if (editField?.queryParams?.where?.type) {
  434. where = JSON.parse(JSON.stringify(editField?.queryParams?.where || {})) || {}
  435. } else {
  436. where = {}
  437. }
  438. console.log(where)
  439. for (let i in columnList) {
  440. let item = columnList[i]
  441. if (item.column_name == 'company') where['company'] = {
  442. "$eq": company
  443. }
  444. if (item.column_name == 'isDeleted') where['isDeleted'] = {
  445. "$ne": true
  446. }
  447. if (pointer_val) {
  448. if (item.column_name == 'name') where['$or'] = [...(where['$or'] || []), {
  449. "name": {
  450. "$regex": `${pointer_val}`
  451. }
  452. }]
  453. if (item.column_name == 'title') where['$or'] = [...(where['$or'] || []), {
  454. "title": {
  455. "$regex": `${pointer_val}`
  456. }
  457. }]
  458. if (item.column_name == 'mobile') where['$or'] = [...(where['$or'] || []), {
  459. "mobile": {
  460. "$regex": `${pointer_val}`
  461. }
  462. }]
  463. if (item.column_name == 'orderNum') where['$or'] = [...(where['$or'] || []), {
  464. "orderNum": {
  465. "$regex": `${pointer_val}`
  466. }
  467. }]
  468. if (item.column_name == 'storeName') where['$or'] = [...(where['$or'] || []), {
  469. "storeName": {
  470. "$regex": `${pointer_val}`
  471. }
  472. }]
  473. }
  474. }
  475. console.log(where)
  476. let queryParams = {
  477. where,
  478. limit: 20,
  479. skip: pointerList?.length || 0
  480. }
  481. let query = new Parse.Query.fromJSON(editField?.targetClass, queryParams)
  482. query.descending('createdAt')
  483. let d = await query.find()
  484. if (!d?.length) {
  485. wx.showToast({
  486. title: '没有更多了',
  487. icon: 'none'
  488. })
  489. return
  490. }
  491. editMap[editField.key].text
  492. let list = d?.map(item => {
  493. let obj = item.toJSON()
  494. if (editMap[editField.key]?.text && editMap[editField.key]?.text?.length > 0) {
  495. if (editField.type == 'Array') {
  496. let x = editMap[editField.key].val.findIndex(val_item => val_item.objectId == obj.objectId)
  497. if (x != -1) {
  498. obj.dev_router_check = true
  499. }
  500. } else {
  501. if (editMap[editField.key].val.objectId == obj.objectId) {
  502. obj.dev_router_check = true
  503. }
  504. }
  505. }
  506. return obj
  507. })
  508. this.setData({
  509. pointerList: [...(pointerList || []), ...(list || [])]
  510. })
  511. },
  512. //#region ShopGoods表specMap字段编辑 ================================================
  513. /**添加属性 - specMap字段 */
  514. addKey_ShopGoods_specMap(e) {
  515. console.log(e)
  516. let {
  517. editMap
  518. } = this.data
  519. let {
  520. key
  521. } = e.currentTarget.dataset
  522. let text = e.detail.value
  523. let obj = {
  524. value: null,
  525. price: null,
  526. vipPrice: null,
  527. }
  528. if (!editMap[key].val?.specList || editMap[key].val?.specList?.length <= 0) editMap[key].val = {
  529. specList: []
  530. }
  531. editMap[key].val['specList'] = [...(editMap[key]?.val?.specList || []), text]
  532. editMap[key].val[text] = [...(editMap[key]?.val[text] || []), obj]
  533. this.setData({
  534. editMap
  535. })
  536. },
  537. /**删除属性 - specMap字段 */
  538. delKey_ShopGoods_specMap(e) {
  539. console.log(e)
  540. let {
  541. editMap
  542. } = this.data
  543. let {
  544. key,
  545. spec_index
  546. } = e.currentTarget.dataset
  547. console.log(key, spec_index)
  548. let text = editMap[key].val.specList[spec_index]
  549. console.log(text)
  550. delete editMap[key].val[text]
  551. editMap[key].val.specList.splice(spec_index, 1)
  552. this.setData({
  553. editMap
  554. })
  555. },
  556. /**设置specMap-value */
  557. setValue(e) {
  558. console.log(e)
  559. let {
  560. editMap
  561. } = this.data
  562. let {
  563. key,
  564. spec,
  565. spec_map_index
  566. } = e.currentTarget.dataset
  567. editMap[key].val[spec][spec_map_index].value = e.detail.value
  568. this.setData({
  569. editMap
  570. })
  571. },
  572. /**设置specMap-price */
  573. setPrice(e) {
  574. console.log(e)
  575. let {
  576. editMap
  577. } = this.data
  578. let {
  579. key,
  580. spec,
  581. spec_map_index
  582. } = e.currentTarget.dataset
  583. editMap[key].val[spec][spec_map_index].price = parseFloat(e.detail.value || 0)
  584. this.setData({
  585. editMap
  586. })
  587. },
  588. /**设置specMap-vipPrice */
  589. setVipPrice(e) {
  590. console.log(e)
  591. let {
  592. editMap
  593. } = this.data
  594. let {
  595. key,
  596. spec,
  597. spec_map_index
  598. } = e.currentTarget.dataset
  599. editMap[key].val[spec][spec_map_index].vipPrice = parseFloat(e.detail.value || 0)
  600. this.setData({
  601. editMap
  602. })
  603. },
  604. /**添加specMap里面key内的item */
  605. addSpecMap(e) {
  606. console.log(e)
  607. let {
  608. editMap
  609. } = this.data
  610. let {
  611. key,
  612. spec
  613. } = e.currentTarget.dataset
  614. let obj = {
  615. value: null,
  616. price: null,
  617. vipPrice: null,
  618. }
  619. editMap[key].val[spec] = [...(editMap[key].val[spec] || []), obj]
  620. this.setData({
  621. editMap
  622. })
  623. },
  624. /**删除specMap里面key内的item */
  625. delSpecMapItem(e) {
  626. console.log(e)
  627. let {
  628. editMap
  629. } = this.data
  630. let {
  631. key,
  632. spec,
  633. spec_map_index
  634. } = e.currentTarget.dataset
  635. editMap[key].val[spec].splice(spec_map_index, 1)
  636. this.setData({
  637. editMap
  638. })
  639. },
  640. //#endregion ShopGoods表specMap字段编辑 end ================================================
  641. /**提交 */
  642. async submit() {
  643. let {
  644. editMap,
  645. queryParamsData,
  646. className,
  647. editFields
  648. } = this.data
  649. console.log(editMap)
  650. let editMapParse = {}
  651. if (!queryParamsData?.id) {
  652. let NewClass = Parse.Object.extend(className)
  653. queryParamsData = new NewClass()
  654. queryParamsData.set('company', {
  655. className: 'Company',
  656. __type: 'Pointer',
  657. objectId: company
  658. })
  659. }
  660. for (let i in editFields) {
  661. let item = editFields[i]
  662. if (item.required && ((!editMap[item.key].val) || editMap[item.key].val?.length <= 0)) {
  663. wx.showToast({
  664. title: `${item.name} 为必填项,请补充`,
  665. icon: 'none'
  666. })
  667. return
  668. }
  669. if((!editMap[item.key].val) || editMap[item.key].val?.length <= 0) continue
  670. if (item.type == 'Number') {
  671. editMapParse[item.key] = parseFloat(editMap[item.key].val)
  672. } else if (item.type == 'String' && item.view == 'edit-image') {
  673. editMapParse[item.key] = editMap[item.key].val[0]?.url
  674. } else if (item.type == 'Array') {
  675. if (item.view == 'edit-image') {
  676. editMapParse[item.key] = editMap[item.key].val?.map(val_item => val_item.url)
  677. } else if (item.view == 'pointer-array') {
  678. editMapParse[item.key] = editMap[item.key].val?.map(val_item => {
  679. return {
  680. __type: 'Pointer',
  681. className: item.targetClass,
  682. objectId: val_item.objectId
  683. }
  684. })
  685. }
  686. }
  687. queryParamsData.set(item.key, editMapParse[item.key] || editMap[item.key].val)
  688. }
  689. console.log(editMap)
  690. console.log(queryParamsData)
  691. await queryParamsData.save()
  692. setTimeout(() => {
  693. wx.navigateBack({
  694. delta: 1
  695. })
  696. }, 1000);
  697. }
  698. }
  699. })