add.vue 16 KB

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