add.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533
  1. <template>
  2. <zj-page-container>
  3. <zj-page-fill>
  4. <div style="box-sizing: border-box; padding:10px;">
  5. <zj-form-container ref="formRef" :form-data="formData" :form-attributes="{ size: 'mini' }">
  6. <zj-form-module title="客户信息" label-width="80px" :form-data="formData" :form-items="formItems" />
  7. <zj-form-module title="商品信息" label-width="80px" :form-data="formData" :form-items="formItems2" />
  8. </zj-form-container>
  9. </div>
  10. </zj-page-fill>
  11. <div style="box-sizing: border-box; padding: 10px; text-align: right;">
  12. <el-button type="primary" size="small" @click="queding">确定</el-button>
  13. </div>
  14. </zj-page-container>
  15. </template>
  16. <script>
  17. import getLbsAmapRegion from "./getLbsAmapRegion.js"
  18. import ImageUpload from '@/components/file-upload'
  19. import editTable from '@/components/template/editTable.js'
  20. import { getClassifyList } from '@/api/goods'
  21. import { esGoodsList } from '@/api/commodityManagement'
  22. import { esOrderAdd } from '@/api/orderManagement'
  23. import { required, mobileRequired, mobile, httpUrl, email } from '@/components/template/rules_verify.js'
  24. export default {
  25. components: {ImageUpload},
  26. mixins: [getLbsAmapRegion, editTable],
  27. props:{
  28. detailsType: {
  29. type: [String, Number],
  30. default: ""
  31. },
  32. },
  33. data(){
  34. return {
  35. formData: {
  36. "area": "",
  37. "brandName": "",
  38. "city": "",
  39. "companyName": "",
  40. "companyWechatId": "",
  41. "createBy": "",
  42. "createTime": "",
  43. "energyLabel": "",
  44. "esCategoryId": "",
  45. "esCategoryName": "",
  46. "esGoodsId": "",
  47. "esGoodsName": "",
  48. "esOrderId": "",
  49. "esOrderInfos": [],
  50. "fileUrl": [],
  51. "goodsNote": "",
  52. "goodsPrice": 0,
  53. "goodsUrl": "",
  54. "logisticsCode": "",
  55. "logisticsName": "",
  56. "logisticsNo": "",
  57. "num": 0,
  58. "overTime": "",
  59. "payStartTime": "",
  60. "payTime": "",
  61. "payType": "",
  62. "pickType": "",
  63. "power": "",
  64. "productionTime": "",
  65. "province": "",
  66. "receAddress": "",
  67. "refundNum": 0,
  68. "refundPrice": 0,
  69. "remark": "",
  70. "saleType": 2,
  71. "sellId": "",
  72. "sellMobile": "",
  73. "sellName": "",
  74. "sellTime": "",
  75. "sellUrl": "",
  76. "sendName": "",
  77. "sendTime": "",
  78. "source": "",
  79. "status": "",
  80. "street": "",
  81. "totalAmount": 0,
  82. "transactionId": "",
  83. "unit": "",
  84. "updateBy": "",
  85. "updateTime": "",
  86. "userAddressId": "",
  87. "userMobile": "",
  88. "userName": "",
  89. "wechatUserId": "",
  90. "wechatUserMobile": "",
  91. "wechatUserName": "",
  92. "wechatUserUrl": "",
  93. // 省
  94. provinceId: "",
  95. // 市
  96. cityId: "",
  97. // 区
  98. areaId: "",
  99. // 街道
  100. streetId: "",
  101. },
  102. classifyList: [],
  103. esGoodsList: []
  104. }
  105. },
  106. computed: {
  107. formItems(){
  108. return [{
  109. name: 'el-input',
  110. md: 6,
  111. attributes: { disabled: false },
  112. formItemAttributes: { label: '客户名称', prop: 'userName', rules:[{ required: true, message: '请填写', trigger: 'blur' }] }
  113. },{
  114. name: 'el-input',
  115. md: 6,
  116. attributes: { disabled: false },
  117. formItemAttributes: { label: '客户电话', prop: 'userMobile', rules: mobileRequired }
  118. },{
  119. name: 'el-radio',
  120. options: [
  121. { label: '到店支付', value: "CASH" },
  122. { label: '转账支付', value: "TRANSFER" },
  123. // { label: '微信支付', value: "WECHAT" },
  124. ],
  125. md: 6,
  126. attributes: { disabled: this.disabled },
  127. formItemAttributes: { label: '支付方式', prop: 'payType', rules:[{ required: true, message: '请填写', trigger: 'blur' }] }
  128. },{
  129. name: 'el-radio',
  130. options: [
  131. { label: '线上销售', value: 1 },
  132. { label: '线下销售', value: 2 },
  133. ],
  134. md: 6,
  135. attributes: { disabled: true },
  136. formItemAttributes: { label: '销售方式', prop: 'saleType', rules:[{ required: true, message: '请填写', trigger: 'blur' }] }
  137. }, ...this.amapRegion, {
  138. name: 'el-input',
  139. md: 24,
  140. attributes: { disabled: false, type:"textarea" },
  141. formItemAttributes: { label: '备注', prop: 'remark' }
  142. },{
  143. md: 24,
  144. name: 'slot-component',
  145. formItemAttributes: {
  146. label: '附件',
  147. prop: 'fileUrl',
  148. rules: []
  149. },
  150. render: (h, { props, onInput }) => {
  151. return (
  152. <ImageUpload fileList={this.formData.fileUrl} limit={1}/>
  153. )
  154. }
  155. }]
  156. },
  157. formItems2(){
  158. return [{
  159. name: 'slot-component',
  160. md: 24,
  161. formItemAttributes: {
  162. label: '',
  163. 'label-width': '0px',
  164. prop: 'esOrderInfos',
  165. rules: [{ required: true, message: '请填写', trigger: 'blur' }]
  166. },
  167. render: (h, { props, onInput }) => {
  168. var { value } = props
  169. return this.convertTableJson(
  170. value,
  171. [
  172. {
  173. columnAttributes: {
  174. label: '商品分类',
  175. prop: 'esCategoryName'
  176. }
  177. },
  178. {
  179. columnAttributes: {
  180. label: '商品名称',
  181. prop: 'esGoodsId'
  182. },
  183. editRender: (h, { row, column, index }) => {
  184. return (
  185. <div class="redbordererr">
  186. <el-form-item
  187. label=""
  188. label-width="0px"
  189. prop={`esOrderInfos.${index}.${column.columnAttributes.prop}`}
  190. rules={[{ required: true, message: '请填写', trigger: 'blur' }]}
  191. >
  192. <el-select
  193. filterable={true}
  194. value={row[column.columnAttributes.prop]}
  195. onInput={val => {
  196. var data = this.esGoodsList.find( item => item.id===val )
  197. row[column.columnAttributes.prop] = val
  198. row.esCategoryId = data?.categoryId ||''
  199. row.esCategoryName = data?.categoryName ||''
  200. row.brandName = data?.brand ||''
  201. console.log(data)
  202. row.unit = '台'
  203. row.sjNum = data?.qty ||''
  204. row.totalAmount = (Number(data?.price) * Number(data?.qty)).toFixed(2);
  205. row.power = data?.power ||''
  206. row.productionTime = data?.makeDate ||''
  207. row.energyLabel = data?.mark ||''
  208. }}
  209. placeholder="请输入内容">
  210. {this.esGoodsList.filter(item=>!this.formData.esOrderInfos.find(v=>v.esGoodsId==item.id ) || row.esGoodsId==item.id ).map((item, index_) => <el-option key={index_} label={item.goodsName} value={item.id}></el-option>)}
  211. </el-select>
  212. </el-form-item>
  213. </div>
  214. )
  215. },
  216. viewRender: (h, { row, column, index }) => {
  217. return (
  218. <div class="redbordererr">
  219. <el-form-item
  220. label=""
  221. label-width="0px"
  222. prop={`esOrderInfos.${index}.${column.columnAttributes.prop}`}
  223. rules={[{ required: true, message: '请填写', trigger: 'blur' }]}
  224. >
  225. <el-select
  226. disabled={true}
  227. value={row[column.columnAttributes.prop]}
  228. onInput={val => {
  229. row[column.columnAttributes.prop] = val
  230. }}
  231. placeholder="请输入内容">
  232. {this.esGoodsList.map((item, index_) => <el-option key={index_} label={item.goodsName} value={item.id}></el-option>)}
  233. </el-select>
  234. </el-form-item>
  235. </div>
  236. )
  237. }
  238. },
  239. {
  240. columnAttributes: {
  241. label: '单位',
  242. prop: 'unit'
  243. }
  244. },
  245. {
  246. columnAttributes: {
  247. label: '上架数量',
  248. prop: 'sjNum'
  249. }
  250. },
  251. {
  252. columnAttributes: {
  253. label: '订单数量',
  254. prop: 'num'
  255. },
  256. editRender: (h, { row, column, index }) => {
  257. return (
  258. <div class="redbordererr">
  259. <el-form-item
  260. label=""
  261. label-width="0px"
  262. prop={`esOrderInfos.${index}.${column.columnAttributes.prop}`}
  263. rules={[{ required: true, message: '请填写', trigger: 'blur' }]}
  264. >
  265. <el-input
  266. value={row[column.columnAttributes.prop]}
  267. onInput={val => {
  268. row[column.columnAttributes.prop] = val
  269. row.totalAmount = (Number(val) * Number(row.goodsPrice)).toFixed(2)
  270. }}
  271. placeholder="请输入内容"
  272. ></el-input>
  273. </el-form-item>
  274. </div>
  275. )
  276. },
  277. viewRender: (h, { row, column, index }) => {
  278. return <div style="padding-left:10px">{row[column.columnAttributes.prop]}</div>
  279. }
  280. },
  281. {
  282. columnAttributes: {
  283. label: '商品价格',
  284. prop: 'goodsPrice'
  285. },
  286. editRender: (h, { row, column, index }) => {
  287. return (
  288. <div class="redbordererr">
  289. <el-form-item
  290. label=""
  291. label-width="0px"
  292. prop={`esOrderInfos.${index}.${column.columnAttributes.prop}`}
  293. rules={[{ required: true, message: '请填写', trigger: 'blur' }]}
  294. >
  295. <el-input
  296. value={row[column.columnAttributes.prop]}
  297. onInput={val => {
  298. row[column.columnAttributes.prop] = val
  299. row.totalAmount = (Number(val) * Number(row.num)).toFixed(2)
  300. }}
  301. placeholder="请输入内容"
  302. ></el-input>
  303. </el-form-item>
  304. </div>
  305. )
  306. },
  307. viewRender: (h, { row, column, index }) => {
  308. return <div style="padding-left:10px">{row[column.columnAttributes.prop]}</div>
  309. }
  310. },
  311. {
  312. columnAttributes: {
  313. label: '金额',
  314. prop: 'totalAmount'
  315. }
  316. },
  317. {
  318. columnAttributes: {
  319. label: '商品品牌',
  320. prop: 'brandName'
  321. }
  322. },
  323. {
  324. columnAttributes: {
  325. label: '功率(W)',
  326. prop: 'power'
  327. }
  328. },
  329. {
  330. columnAttributes: {
  331. label: '制造日期',
  332. prop: 'productionTime'
  333. }
  334. },
  335. {
  336. columnAttributes: {
  337. label: '能效标识',
  338. prop: 'energyLabel'
  339. }
  340. },
  341. ],
  342. {
  343. isEdit: true,
  344. isAdd: true,
  345. isDel: true
  346. },
  347. {
  348. add: () => {
  349. this.formData.esOrderInfos.push({
  350. "area": "",
  351. "brandName": "",
  352. "city": "",
  353. "companyName": "",
  354. "companyWechatId": "",
  355. "createBy": "",
  356. "createTime": "",
  357. "energyLabel": "",
  358. "esCategoryId": "",
  359. "esCategoryName": "",
  360. "esGoodsId": "",
  361. "esGoodsName": "",
  362. "esOrderId": "",
  363. "fileUrl": "",
  364. "goodsNote": "",
  365. "goodsPrice": "",
  366. "goodsUrl": "",
  367. "logisticsCode": "",
  368. "logisticsName": "",
  369. "logisticsNo": "",
  370. "num": "",
  371. "overTime": "",
  372. "payStartTime": "",
  373. "payTime": "",
  374. "payType": "",
  375. "pickType": "",
  376. "power": "",
  377. "productionTime": "",
  378. "province": "",
  379. "receAddress": "",
  380. "refundNum": 0,
  381. "refundPrice": 0,
  382. "remark": "",
  383. "saleType": 2,
  384. "sellId": "",
  385. "sellMobile": "",
  386. "sellName": "",
  387. "sellTime": "",
  388. "sellUrl": "",
  389. "sendName": "",
  390. "sendTime": "",
  391. "source": "",
  392. "status": "",
  393. "street": "",
  394. "totalAmount": "",
  395. "transactionId": "",
  396. "unit": "",
  397. "updateBy": "",
  398. "updateTime": "",
  399. "userAddressId": "",
  400. "userMobile": "",
  401. "userName": "",
  402. "wechatUserId": "",
  403. "wechatUserMobile": "",
  404. "wechatUserName": "",
  405. "wechatUserUrl": "",
  406. sjNum:""
  407. })
  408. this.isEditTableIndex = this.formData.esOrderInfos.length - 1
  409. },
  410. verify: ({ row, column, index }, isEditTableIndex) => {
  411. return new Promise(r => {
  412. if (isEditTableIndex > -1) {
  413. this.$refs.formRef.validateField(
  414. [
  415. `esOrderInfos.${isEditTableIndex}.esCategoryId`,
  416. `esOrderInfos.${isEditTableIndex}.esGoodsId`,
  417. `esOrderInfos.${isEditTableIndex}.num`,
  418. `esOrderInfos.${isEditTableIndex}.goodsPrice`,
  419. ],
  420. v => {
  421. if (v) {
  422. r(true)
  423. } else {
  424. r(false)
  425. }
  426. }
  427. )
  428. } else {
  429. r(true)
  430. }
  431. })
  432. },
  433. }
  434. )
  435. }
  436. }]
  437. }
  438. },
  439. created(){
  440. getClassifyList({
  441. status:true,
  442. type:5
  443. }).then(res=>{
  444. this.classifyList = res.data
  445. })
  446. esGoodsList({"pageNum":1,"pageSize":-1,"params":[{"param":"a.status","compare":"=","value":"ON"}]}).then(res=>{
  447. this.esGoodsList = res.data.records
  448. if(this?.$route?.params?.pageType==="add" && this?.$route?.params?.pageCode && this.detailsType == 0){
  449. var data = this.esGoodsList.find( item => item.id===this?.$route?.params?.pageCode )
  450. this.formData.esOrderInfos.push({
  451. "area": "",
  452. "brandName": data?.brand ||'',
  453. "city": "",
  454. "companyName": "",
  455. "companyWechatId": "",
  456. "createBy": "",
  457. "createTime": "",
  458. "energyLabel": data?.mark ||'',
  459. "esCategoryId": data?.categoryId ||'',
  460. "esCategoryName": data?.categoryName ||'',
  461. "esGoodsId": this?.$route?.params?.pageCode,
  462. "esGoodsName": "",
  463. "esOrderId": "",
  464. "fileUrl": "",
  465. "goodsNote": "",
  466. "goodsPrice": "",
  467. "goodsUrl": "",
  468. "logisticsCode": "",
  469. "logisticsName": "",
  470. "logisticsNo": "",
  471. "num": "",
  472. "overTime": "",
  473. "payStartTime": "",
  474. "payTime": "",
  475. "payType": "",
  476. "pickType": "",
  477. "power": data?.power ||'',
  478. "productionTime": data?.makeDate ||'',
  479. "province": "",
  480. "receAddress": "",
  481. "refundNum": 0,
  482. "refundPrice": 0,
  483. "remark": "",
  484. "saleType": 2,
  485. "sellId": "",
  486. "sellMobile": "",
  487. "sellName": "",
  488. "sellTime": "",
  489. "sellUrl": "",
  490. "sendName": "",
  491. "sendTime": "",
  492. "source": "",
  493. "status": "",
  494. "street": "",
  495. "totalAmount": (Number(data?.price) * Number(data?.qty)).toFixed(2),
  496. "transactionId": "",
  497. "unit": '台',
  498. "updateBy": "",
  499. "updateTime": "",
  500. "userAddressId": "",
  501. "userMobile": "",
  502. "userName": "",
  503. "wechatUserId": "",
  504. "wechatUserMobile": "",
  505. "wechatUserName": "",
  506. "wechatUserUrl": "",
  507. sjNum:data?.qty ||''
  508. })
  509. this.isEditTableIndex = 0
  510. }
  511. })
  512. },
  513. methods: {
  514. queding(){
  515. this.$refs.formRef.validate((valid, invalidFields, errLabels) => {
  516. if(valid){
  517. esOrderAdd({
  518. ...this.formData,
  519. fileUrl: this.formData.fileUrl.map(item=>item.url).join(",")
  520. }).then(res=>{
  521. this.$message({ type: 'success', message: `成功!` })
  522. this.$emit("removeTab")
  523. })
  524. }
  525. })
  526. }
  527. }
  528. }
  529. </script>
  530. <style lang="scss" scoped>
  531. </style>