index.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966
  1. <script setup lang="ts" name="Order">
  2. import apis from "@a"
  3. import dayjs from "dayjs"
  4. import message from "@@/utils/message"
  5. import CustomerSelect from "@/components/modal-select/CustomerSelect.vue"
  6. import ExpectedProductionSelect from "@/components/modal-select/ExpectedProductionSelect.vue"
  7. import VbFeedbackModal from "./components/VbFeedbackModal.vue"
  8. import VbPayRecordModal from "./components/VbPayRecordModal.vue"
  9. import { customerOptions } from "@/views/erp/_common"
  10. const isEdit = ref(false)
  11. const tableRef = ref()
  12. const tableItemRef = ref()
  13. const modalRef = ref()
  14. const modalItemRef = ref()
  15. const modalSendRef = ref()
  16. const modalFeedbackRef = ref()
  17. const modalPayRecordRef = ref()
  18. const customerModalRef = ref()
  19. const expectedProductionModalRef = ref()
  20. const customerOption = ref([])
  21. customerOptions().then((v: any) => {
  22. customerOption.value = v
  23. })
  24. const opts = reactive({
  25. columns: [
  26. { field: "id", name: "", width: 100, isSort: true, visible: false, tooltip: true },
  27. {
  28. field: "orderNum",
  29. name: "订单编号",
  30. visible: true,
  31. isSort: false,
  32. width: "120",
  33. tooltip: true
  34. },
  35. {
  36. field: "customerName",
  37. name: "客户",
  38. visible: true,
  39. isSort: false,
  40. width: "180",
  41. tooltip: true
  42. },
  43. { field: "price", name: "价格", visible: true, isSort: false, width: 145 },
  44. { field: "deliveryDate", name: "交付日期", visible: true, isSort: false, width: 145 },
  45. { field: "status", name: "状态", visible: true, isSort: false, width: 100 },
  46. { field: "remark", name: "备注", visible: false, isSort: false, tooltip: true },
  47. { field: "actions", name: `操作`, width: 150 }
  48. ] as any[],
  49. queryParams: {
  50. orderNum: undefined,
  51. customerId: undefined,
  52. dateRangeDeliveryDate: undefined,
  53. status: undefined
  54. },
  55. searchFormItems: [
  56. {
  57. field: "orderNum",
  58. label: "订单编号",
  59. class: "w-100",
  60. required: false,
  61. placeholder: "请输入订单编号",
  62. component: "I",
  63. listeners: {
  64. keyup: (e: KeyboardEvent) => {
  65. if (e.code == "Enter") {
  66. handleQuery()
  67. }
  68. }
  69. }
  70. },
  71. {
  72. field: "customerId",
  73. label: "客户",
  74. class: "w-100",
  75. required: false,
  76. placeholder: "请输入客户",
  77. component: "I",
  78. listeners: {
  79. keyup: (e: KeyboardEvent) => {
  80. if (e.code == "Enter") {
  81. handleQuery()
  82. }
  83. }
  84. }
  85. },
  86. {
  87. field: "dateRangeDeliveryDate",
  88. label: "交付日期",
  89. class: "w-100",
  90. required: false,
  91. component: "D",
  92. placeholder: "请选择交付日期",
  93. props: {
  94. type: "daterange",
  95. valueFormat: "YYYY-MM-DD",
  96. rangeSeparator: "-",
  97. startPlaceholder: "开始日期",
  98. endPlaceholder: "结束日期"
  99. },
  100. listeners: {
  101. change: (v: any) => {
  102. queryParams.value.dateRangeDeliveryDate = v
  103. handleQuery()
  104. }
  105. },
  106. span: 5
  107. },
  108. {
  109. field: "status",
  110. label: "状态",
  111. class: "w-100",
  112. required: false,
  113. component: "Dict",
  114. props: {
  115. placeholder: "请选择状态",
  116. dictType: "order_status",
  117. valueIsNumber: 1,
  118. type: "select"
  119. },
  120. listeners: {
  121. change: () => {
  122. handleQuery()
  123. }
  124. }
  125. }
  126. ] as any,
  127. permission: "erp:order",
  128. handleBtns: [],
  129. handleFuns: {
  130. handleCreate,
  131. handleUpdate: () => {
  132. const row = tableRef.value.getSelected()
  133. handleUpdate(row)
  134. },
  135. handleDelete: () => {
  136. const rows = tableRef.value.getSelecteds()
  137. handleDelete(rows)
  138. }
  139. },
  140. customBtns: [],
  141. tableListFun: apis.erp.orderApi.list,
  142. getEntityFun: apis.erp.orderApi.get,
  143. deleteEntityFun: apis.erp.orderApi.del,
  144. exportUrl: apis.erp.orderApi.exportUrl,
  145. exportName: "Order",
  146. modalTitle: "订单管理",
  147. formItems: [
  148. {
  149. field: "orderNum",
  150. label: "订单编号",
  151. disabled: true,
  152. class: "w-100",
  153. required: true,
  154. placeholder: "请输入订单编号",
  155. component: "I"
  156. },
  157. {
  158. field: "customerName",
  159. label: "客户",
  160. class: "w-100",
  161. required: true,
  162. placeholder: "请输入客户",
  163. component: "I",
  164. disabled: true,
  165. //component: "slot"
  166. appendClickFunc: handleShowCustomerModal,
  167. appendDisabled: () => isEdit.value
  168. },
  169. {
  170. field: "deliveryDate",
  171. label: "交付日期",
  172. class: "w-100",
  173. required: true,
  174. component: "D",
  175. props: {
  176. placeholder: "请选择交付日期",
  177. type: "date",
  178. valueFormat: "YYYY-MM-DD"
  179. }
  180. },
  181. {
  182. field: "price",
  183. label: "价格",
  184. class: "w-100",
  185. required: true,
  186. component: "I",
  187. props: {
  188. placeholder: "请输入价格",
  189. type: "number"
  190. }
  191. },
  192. // {
  193. // field: "status",
  194. // label: "状态",
  195. // class: "w-100",
  196. // required: true,
  197. // component: "Dict",
  198. // props: {
  199. // dictType: "order_status",
  200. // type: "radio",
  201. // valueIsNumber: 1
  202. // }
  203. // },
  204. {
  205. field: "remark",
  206. label: "备注",
  207. class: "w-100",
  208. required: false,
  209. placeholder: "请输入备注",
  210. component: "I",
  211. props: {
  212. type: "textarea",
  213. placeholder: "请输入备注"
  214. }
  215. }
  216. ] as any,
  217. resetForm: () => {
  218. form.value = emptyFormData.value
  219. },
  220. labelWidth: "80px",
  221. emptyFormData: {
  222. id: undefined,
  223. orderNum: undefined,
  224. customerId: undefined,
  225. customerNum: undefined,
  226. customerName: undefined,
  227. deliveryDate: undefined,
  228. price: undefined,
  229. status: 1,
  230. remark: undefined
  231. }
  232. })
  233. const orderSelectId = ref()
  234. const orderSelectNum = ref()
  235. //const orderSelectStatus = ref()
  236. const itemOpts = reactive({
  237. columns: [
  238. { field: "id", name: "详情ID", width: 100, isSort: true, visible: false, tooltip: true },
  239. {
  240. field: "variety",
  241. name: "品系",
  242. visible: true,
  243. isSort: false,
  244. width: "auto",
  245. tooltip: true
  246. },
  247. {
  248. field: "quantity",
  249. name: "订单数量",
  250. visible: true,
  251. isSort: false,
  252. width: "auto",
  253. tooltip: true
  254. },
  255. // {
  256. // field: "sendDate",
  257. // name: "发货日期",
  258. // visible: true,
  259. // isSort: false,
  260. // width: "auto",
  261. // tooltip: true
  262. // },
  263. {
  264. field: "sendQuantity",
  265. name: "发货数量",
  266. visible: true,
  267. isSort: false,
  268. width: "auto",
  269. tooltip: true
  270. },
  271. // {
  272. // field: "deliveryDate",
  273. // name: "交付日期",
  274. // visible: true,
  275. // isSort: false,
  276. // width: "auto",
  277. // tooltip: true
  278. // },
  279. // { field: "carNum", name: "车牌号", visible: true, isSort: false, tooltip: true },
  280. // { field: "signedPhoto", name: "签收照片", visible: true, isSort: false, tooltip: true },
  281. { field: "status", name: "状态", visible: true, isSort: false, tooltip: true },
  282. { field: "actions", name: `操作`, width: 150 }
  283. ] as any[],
  284. itemQueryParams: {
  285. orderId: undefined
  286. },
  287. permission: "erp:orderItem",
  288. handleBtns: [],
  289. handleFuns: {
  290. handleCreate: () => {
  291. handleItemCreate()
  292. },
  293. handleUpdate: () => {
  294. const row = tableItemRef.value.getSelected()
  295. handleItemUpdate(row)
  296. },
  297. handleDelete: () => {
  298. const rows = tableItemRef.value.getSelecteds()
  299. handleItemDelete(rows)
  300. }
  301. },
  302. customBtns: [],
  303. tableListFun: apis.erp.orderItemApi.list,
  304. getEntityFun: apis.erp.orderItemApi.get,
  305. deleteEntityFun: apis.erp.orderItemApi.del,
  306. exportUrl: apis.erp.orderItemApi.exportUrl,
  307. exportName: "OrderItem",
  308. modalTitle: "订单商品详情",
  309. formItems: [
  310. {
  311. field: "orderNum",
  312. label: "订单编号",
  313. disabled: true,
  314. class: "w-100",
  315. required: true,
  316. placeholder: "请输入订单编号",
  317. component: "I"
  318. },
  319. {
  320. field: "variety",
  321. label: "品系",
  322. class: "w-100",
  323. required: true,
  324. placeholder: "请输入品系",
  325. component: "I",
  326. disabled: true,
  327. appendClickFunc: handleShowExpectedProductionModal
  328. },
  329. {
  330. field: "quantity",
  331. label: "订单数量",
  332. class: "w-100",
  333. required: true,
  334. component: "I",
  335. props: {
  336. type: "number",
  337. min: 0
  338. }
  339. }
  340. // {
  341. // field: "sendDate",
  342. // label: "发货日期",
  343. // class: "w-100",
  344. // required: false,
  345. // component: "D",
  346. // props: {
  347. // placeholder: "请选择发货日期",
  348. // type: "date",
  349. // valueFormat: "YYYY-MM-DD"
  350. // }
  351. // },
  352. // {
  353. // field: "sendQuantity",
  354. // label: "发货数量",
  355. // class: "w-100",
  356. // required: false,
  357. // component: "I",
  358. // props: {
  359. // type: "number",
  360. // min: 0
  361. // }
  362. // },
  363. // {
  364. // field: "deliveryDate",
  365. // label: "交付日期",
  366. // class: "w-100",
  367. // required: false,
  368. // component: "D",
  369. // props: {
  370. // placeholder: "请选择交付日期",
  371. // type: "date",
  372. // valueFormat: "YYYY-MM-DD"
  373. // }
  374. // },
  375. // {
  376. // field: "carNum",
  377. // label: "车牌号",
  378. // class: "w-100",
  379. // required: false,
  380. // placeholder: "请输入车牌号",
  381. // component: "I"
  382. // },
  383. // {
  384. // field: "signedPhoto",
  385. // label: "签收照片",
  386. // class: "w-100",
  387. // required: false,
  388. // placeholder: "请上传签收照片",
  389. // component: "VbUpload",
  390. // props: {
  391. // uploadUrl: "resource/oss/upload/erp"
  392. // }
  393. // }
  394. ] as any,
  395. resetForm: () => {
  396. // console.log("resetForm", orderItemSelectId.value, detailEmptyFormData.value)
  397. if (orderSelectId.value || orderSelectId.value !== 0) {
  398. itemEmptyFormData.value.orderId = orderSelectId.value
  399. }
  400. itemForm.value = itemEmptyFormData.value
  401. },
  402. labelWidth: "80px",
  403. itemEmptyFormData: {
  404. id: undefined,
  405. orderId: undefined,
  406. orderNum: undefined,
  407. expected_production_id: undefined,
  408. productionQuantity: undefined,
  409. variety: undefined,
  410. quantity: 0,
  411. sendDate: undefined,
  412. sendQuantity: 0,
  413. deliveryDate: undefined,
  414. carNum: undefined,
  415. signedPhoto: undefined,
  416. status: 1,
  417. remark: undefined
  418. }
  419. })
  420. const { queryParams, emptyFormData } = toRefs(opts)
  421. const form = ref<any>(emptyFormData.value)
  422. /** 搜索按钮操作 */
  423. function handleQuery(query?: any) {
  424. query = query || tableRef.value?.getQueryParams() || queryParams.value
  425. addDateRange(query, query.dateRangeDeliveryDate, "DeliveryDate")
  426. addDateRange(query, query.dateRangeCreateTime)
  427. addDateRange(query, query.dateRangeUpdateTime, "UpdateTime")
  428. tableRef.value?.query(query)
  429. }
  430. /** 重置按钮操作 */
  431. function resetQuery(query?: any) {
  432. query = query || tableRef.value?.getQueryParams() || queryParams.value
  433. query.dateRangeDeliveryDate = [] as any
  434. addDateRange(query, query.dateRangeDeliveryDate, "DeliveryDate")
  435. query.dateRangeCreateTime = [] as any
  436. addDateRange(query, query.dateRangeCreateTime)
  437. query.dateRangeUpdateTime = [] as any
  438. addDateRange(query, query.dateRangeUpdateTime, "UpdateTime")
  439. //
  440. }
  441. function handleCreate() {
  442. isEdit.value = false
  443. apis.erp.orderApi.getOrderNum().then((res: any) => {
  444. form.value.orderNum = res.msg
  445. })
  446. tableRef.value.defaultHandleFuns.handleCreate()
  447. }
  448. /** 修改按钮操作 */
  449. function handleUpdate(row: any) {
  450. isEdit.value = true
  451. tableRef.value.defaultHandleFuns.handleUpdate("", row)
  452. }
  453. /** 删除按钮操作 */
  454. function handleDelete(rows: any[]) {
  455. tableRef.value.defaultHandleFuns.handleDelete("", rows)
  456. }
  457. /** 提交按钮 */
  458. function submitForm() {
  459. apis.erp.orderApi.addOrUpdate(form.value).then(() => {
  460. handleQuery()
  461. })
  462. }
  463. function handleAudit(rows: any[]) {
  464. if (rows.length > 1) {
  465. message.msgError("只能选择一条数据")
  466. return
  467. }
  468. console.log("handleAudit", rows)
  469. message.confirm("确定要审核吗?", "确定").then(() => {
  470. apis.erp.orderApi.audit(rows[0].id).then(() => {
  471. handleQuery()
  472. })
  473. })
  474. }
  475. /** 结清按钮操作 */
  476. function handleComplete(rows: any[]) {
  477. if (rows.length > 1) {
  478. message.msgError("只能选择一条数据")
  479. return
  480. }
  481. message.confirm("确定要结清吗?", "确定").then(() => {
  482. apis.erp.orderApi.complete(rows[0].id).then(() => {
  483. handleQuery()
  484. })
  485. })
  486. }
  487. function handleCancel(rows: any[]) {
  488. if (rows.length > 1) {
  489. message.msgError("只能选择一条数据")
  490. return
  491. }
  492. message.confirm("确定要退订吗?", "确定").then(() => {
  493. apis.erp.orderApi.cancel(rows[0].id).then(() => {
  494. handleQuery()
  495. })
  496. })
  497. }
  498. function handleAuditCancel(rows: any[]) {
  499. if (rows.length > 1) {
  500. message.msgError("只能选择一条数据")
  501. return
  502. }
  503. message.confirm("确定要审核退订记录吗?", "确定").then(() => {
  504. apis.erp.orderApi.auditCancel(rows[0].id).then(() => {
  505. handleQuery()
  506. })
  507. })
  508. }
  509. function handlePayRecord() {
  510. const rows = tableRef.value.getSelecteds()
  511. if (rows.length !== 1) {
  512. message.msgError("请选择一条记录")
  513. return
  514. }
  515. // 显示付款记录模态框
  516. modalPayRecordRef.value.show(rows[0])
  517. }
  518. function handleFeedback(rows: any[]) {
  519. if (rows.length > 1) {
  520. message.msgError("只能选择一条数据")
  521. return
  522. }
  523. // 调用回访记录模态框组件的show方法
  524. modalFeedbackRef.value.show(rows[0])
  525. }
  526. function handleShowCustomerModal() {
  527. customerModalRef.value.open()
  528. }
  529. function handleConfirmCustomerModal(rows: any[]) {
  530. if (rows.length > 0) {
  531. form.value.customerId = rows[0].id
  532. form.value.customerNum = rows[0].customerNum
  533. form.value.customerName = rows[0].customerName
  534. }
  535. }
  536. function handleCheckBoxChange(isChecked: boolean, row: any) {
  537. orderSelectId.value = isChecked ? row.id : 0
  538. orderSelectNum.value = isChecked ? row.orderNum : ""
  539. //orderSelectStatus.value = isChecked ? row.status : undefined
  540. itemQueryParams.value.orderId = isChecked ? row.id : undefined
  541. itemForm.value.orderId = isChecked ? row.id : undefined
  542. handleItemQuery(itemQueryParams.value)
  543. }
  544. function handleQuerySuccess() {
  545. const data = tableRef.value.getFirstRowData()
  546. tableRef.value.setSelected(data, true)
  547. }
  548. const { itemQueryParams, itemEmptyFormData } = toRefs(itemOpts)
  549. const itemForm = ref<any>(itemEmptyFormData.value)
  550. function handleItemCreate() {
  551. itemForm.value = itemEmptyFormData.value
  552. tableItemRef.value.defaultHandleFuns.handleCreate()
  553. nextTick(() => {
  554. itemForm.value.orderId = orderSelectId.value
  555. itemForm.value.orderNum = orderSelectNum.value
  556. })
  557. }
  558. function handleItemUpdate(row: any) {
  559. tableItemRef.value.defaultHandleFuns.handleUpdate("", row)
  560. }
  561. function handleItemDelete(rows: any) {
  562. tableItemRef.value.defaultHandleFuns.handleDelete("", rows)
  563. }
  564. function handleItemQuery(query?: any) {
  565. query = query || tableItemRef.value?.getQueryParams() || itemQueryParams.value
  566. tableItemRef.value?.query(query)
  567. }
  568. const sendOpts = {
  569. modalTitle: "订单发货",
  570. formItems: [
  571. {
  572. field: "sendDate",
  573. label: "发货日期",
  574. class: "w-100",
  575. required: true,
  576. component: "D",
  577. props: {
  578. placeholder: "请选择发货日期",
  579. type: "date",
  580. valueFormat: "YYYY-MM-DD"
  581. }
  582. },
  583. {
  584. field: "sendQuantity",
  585. label: "发货数量",
  586. class: "w-100",
  587. required: true,
  588. component: "I",
  589. props: {
  590. type: "number",
  591. min: 0
  592. }
  593. },
  594. {
  595. field: "deliveryDate",
  596. label: "交付日期",
  597. class: "w-100",
  598. required: false,
  599. component: "D",
  600. props: {
  601. placeholder: "请选择交付日期",
  602. type: "date",
  603. valueFormat: "YYYY-MM-DD"
  604. }
  605. },
  606. {
  607. field: "carNum",
  608. label: "车牌号",
  609. class: "w-100",
  610. required: false,
  611. placeholder: "请输入车牌号",
  612. component: "I"
  613. },
  614. {
  615. field: "signedPhoto",
  616. label: "签收照片",
  617. class: "w-100",
  618. required: false,
  619. placeholder: "请上传签收照片",
  620. component: "VbUpload",
  621. props: {
  622. uploadUrl: "resource/oss/upload/erp"
  623. }
  624. }
  625. ] as any,
  626. resetForm: () => {
  627. // console.log("resetForm", orderItemSelectId.value, detailEmptyFormData.value)
  628. if (orderSelectId.value || orderSelectId.value !== 0) {
  629. itemEmptyFormData.value.orderId = orderSelectId.value
  630. }
  631. itemForm.value = itemEmptyFormData.value
  632. },
  633. labelWidth: "80px",
  634. sendEmptyFormData: {
  635. id: undefined,
  636. orderItemId: undefined,
  637. orderQuantity: 0,
  638. sendDate: undefined,
  639. sendQuantity: 0,
  640. deliveryDate: undefined,
  641. carNum: undefined,
  642. signedPhoto: undefined,
  643. status: 0,
  644. remark: undefined
  645. }
  646. }
  647. const sendForm = ref<any>(sendOpts.sendEmptyFormData)
  648. function handleItemSend(row: any) {
  649. //itemForm.value = row
  650. //todo 新增发货记录 弹出一个发货编辑的模态窗
  651. sendForm.value.orderItemId = row.id
  652. sendForm.value.orderQuantity = row.quantity
  653. modalSendRef.value.show()
  654. }
  655. /** 提交按钮 */
  656. function submitItemForm() {
  657. if (!itemForm.value || !itemForm.value.orderId) {
  658. message.msgError("请先选择一条订单记录创建详情")
  659. return
  660. }
  661. if (Number(itemForm.value.sendQuantity) > Number(itemForm.value.quantity)) {
  662. message.msgError("发货数量不能大于订单数量")
  663. return
  664. }
  665. apis.erp.orderItemApi.addOrUpdate(itemForm.value).then(() => {
  666. handleItemQuery()
  667. })
  668. }
  669. function handleShowExpectedProductionModal() {
  670. expectedProductionModalRef.value.open()
  671. }
  672. function handleConfirmExpectedProductionModal(rows: any[]) {
  673. if (rows.length > 0) {
  674. itemForm.value.expectedProductionId = rows[0].id
  675. itemForm.value.variety = rows[0].variety
  676. itemForm.value.productionQuantity = rows[0].productionQuantity
  677. }
  678. }
  679. function submitSendForm() {
  680. if (!sendForm.value || !sendForm.value.orderItemId) {
  681. message.msgError("请先选择一条订单记录创建发货记录")
  682. return
  683. }
  684. if (Number(sendForm.value.sendQuantity) > Number(sendForm.value.orderQuantity)) {
  685. message.msgError("发货数量不能大于订单数量")
  686. return
  687. }
  688. message.confirm("确定要发货吗?", "确定").then(() => {
  689. apis.erp.orderSendApi.addOrUpdate(sendForm.value).then(() => {
  690. handleItemQuery()
  691. })
  692. })
  693. }
  694. </script>
  695. <template>
  696. <div class="app-container">
  697. <div class="d-flex flex-column">
  698. <div class="h-400px" style="border-bottom: 4px solid #ddd">
  699. <VbDataTable
  700. ref="tableRef"
  701. keyField="id"
  702. :columns="opts.columns"
  703. :handle-perm="opts.permission"
  704. :handle-btns="opts.handleBtns"
  705. :handle-funs="opts.handleFuns"
  706. :search-form-items="opts.searchFormItems"
  707. :custom-btns="opts.customBtns"
  708. :remote-fun="opts.tableListFun"
  709. :get-entity-fun="opts.getEntityFun"
  710. :delete-entity-fun="opts.deleteEntityFun"
  711. :export-url="opts.exportUrl"
  712. :export-name="opts.exportName"
  713. :modal="modalRef"
  714. :reset-form-fun="opts.resetForm"
  715. v-model:form-data="form"
  716. v-model:query-params="queryParams"
  717. :check-multiple="false"
  718. :has-checkbox="true"
  719. :reset-search-form-fun="resetQuery"
  720. :custom-search-fun="handleQuery"
  721. @checkbox-change="handleCheckBoxChange"
  722. @query-success="handleQuerySuccess">
  723. <template #deliveryDate="{ row }">
  724. <template v-if="row.deliveryDate">
  725. {{ dayjs(row.deliveryDate).format("YYYY-MM-DD") }}
  726. </template>
  727. <template v-else>-</template>
  728. </template>
  729. <template #status="{ row }">
  730. <DictTag type="order_status" :value-is-number="1" :value="row.status"></DictTag>
  731. </template>
  732. <template #actions="{ row }">
  733. <vb-tooltip content="修改" placement="top" v-if="row.status === 1">
  734. <el-button
  735. link
  736. type="primary"
  737. @click="handleUpdate(row)"
  738. v-hasPermission="'erp:order:edit'">
  739. <template #icon>
  740. <VbIcon icon-name="notepad-edit" icon-type="duotone" class="fs-3"></VbIcon>
  741. </template>
  742. </el-button>
  743. </vb-tooltip>
  744. <vb-tooltip content="退订" placement="top" v-if="row.status === 1">
  745. <el-button
  746. link
  747. type="primary"
  748. @click="handleCancel([row])"
  749. v-hasPermission="'erp:order:cancel'">
  750. <template #icon>
  751. <VbIcon
  752. icon-name="abstract-11"
  753. icon-type="duotone"
  754. class="fs-3 text-danger"></VbIcon>
  755. </template>
  756. </el-button>
  757. </vb-tooltip>
  758. <vb-tooltip content="审核" placement="top" v-if="row.status === 1">
  759. <el-button
  760. link
  761. type="primary"
  762. @click="handleAudit([row])"
  763. v-hasPermission="'erp:order:audit'">
  764. <template #icon>
  765. <VbIcon
  766. icon-name="security-user"
  767. icon-type="duotone"
  768. class="fs-3 text-warning"></VbIcon>
  769. </template>
  770. </el-button>
  771. </vb-tooltip>
  772. <vb-tooltip content="退订审核" placement="top" v-if="row.status === 4">
  773. <el-button
  774. link
  775. type="primary"
  776. @click="handleAuditCancel([row])"
  777. v-hasPermission="'erp:order:auditCancel'">
  778. <template #icon>
  779. <VbIcon
  780. icon-name="key-square"
  781. icon-type="duotone"
  782. class="fs-3 text-warning"></VbIcon>
  783. </template>
  784. </el-button>
  785. </vb-tooltip>
  786. <vb-tooltip content="售后回访记录" placement="top">
  787. <el-button
  788. link
  789. type="primary"
  790. @click="handleFeedback([row])"
  791. v-hasPermission="'erp:feedback:add'">
  792. <template #icon>
  793. <VbIcon
  794. icon-name="abstract-14"
  795. icon-type="duotone"
  796. class="fs-3 text-primary"></VbIcon>
  797. </template>
  798. </el-button>
  799. </vb-tooltip>
  800. <vb-tooltip content="付款记录" placement="top">
  801. <el-button
  802. link
  803. type="primary"
  804. @click="handlePayRecord()"
  805. v-hasPermission="'erp:payRecord:add'">
  806. <template #icon>
  807. <VbIcon icon-name="paypal" icon-type="duotone" class="fs-3 text-danger"></VbIcon>
  808. </template>
  809. </el-button>
  810. </vb-tooltip>
  811. <vb-tooltip content="结清" placement="top" v-if="row.status === 2">
  812. <el-button
  813. link
  814. type="primary"
  815. @click="handleComplete([row])"
  816. v-hasPermission="'erp:order:complete'">
  817. <template #icon>
  818. <VbIcon icon-name="check" icon-type="duotone" class="fs-3 text-success"></VbIcon>
  819. </template>
  820. </el-button>
  821. </vb-tooltip>
  822. </template>
  823. </VbDataTable>
  824. </div>
  825. <div class="mt-1 h-200px">
  826. <VbDataTable
  827. ref="tableItemRef"
  828. keyField="id"
  829. tableBoxHeight="380px"
  830. :showRightToolbar="false"
  831. :showSearchBar="false"
  832. :columns="itemOpts.columns"
  833. :handle-perm="itemOpts.permission"
  834. :handle-btns="itemOpts.handleBtns"
  835. :handle-funs="itemOpts.handleFuns"
  836. :custom-btns="itemOpts.customBtns"
  837. :remote-fun="itemOpts.tableListFun"
  838. :get-entity-fun="itemOpts.getEntityFun"
  839. :delete-entity-fun="itemOpts.deleteEntityFun"
  840. :export-url="itemOpts.exportUrl"
  841. :export-name="itemOpts.exportName"
  842. :modal="modalItemRef"
  843. :reset-form-fun="itemOpts.resetForm"
  844. v-model:form-data="itemForm"
  845. v-model:query-params="itemQueryParams"
  846. :noPage="true"
  847. :check-multiple="true">
  848. <!-- @form-edit="handleItemEdit" -->
  849. <template #status="{ row }">
  850. <DictTag type="order_item_status" :value-is-number="true" :value="row.status"></DictTag>
  851. </template>
  852. <!-- <template #signedPhoto="{ row }">
  853. <VbImagePreview
  854. v-if="row.signedPhoto"
  855. :src="row.signedPhoto"
  856. :image-style="{ margin: `6px 5px -10px 5px`, padding: 0 }"></VbImagePreview>
  857. <template v-else>-</template>
  858. </template> -->
  859. <template #actions="{ row }">
  860. <vb-tooltip content="修改" placement="top" v-if="row.status === 1">
  861. <el-button
  862. link
  863. type="primary"
  864. @click="handleItemUpdate(row)"
  865. v-hasPermission="'erp:orderItem:edit'">
  866. <template #icon>
  867. <VbIcon icon-name="notepad-edit" icon-type="duotone" class="fs-3"></VbIcon>
  868. </template>
  869. </el-button>
  870. </vb-tooltip>
  871. <vb-tooltip content="发货" placement="top" v-if="row.status === 2 || row.status === 3">
  872. <el-button
  873. link
  874. type="primary"
  875. @click="handleItemSend(row)"
  876. v-hasPermission="'erp:orderItem:send'">
  877. <template #icon>
  878. <VbIcon icon-name="send" icon-type="solid" class="fs-3 text-success"></VbIcon>
  879. </template>
  880. </el-button>
  881. </vb-tooltip>
  882. <vb-tooltip content="删除" placement="top" v-if="row.status === 1">
  883. <el-button
  884. link
  885. type="primary"
  886. @click="handleItemDelete([row])"
  887. v-hasPermission="'erp:orderItem:remove'">
  888. <template #icon>
  889. <VbIcon icon-name="trash-square" icon-type="duotone" class="fs-3"></VbIcon>
  890. </template>
  891. </el-button>
  892. </vb-tooltip>
  893. </template>
  894. </VbDataTable>
  895. </div>
  896. </div>
  897. <VbModal
  898. v-model:modal="modalRef"
  899. :title="opts.modalTitle"
  900. :form-data="form"
  901. :form-items="opts.formItems"
  902. :label-width="opts.labelWidth"
  903. append-to-body
  904. @confirm="submitForm">
  905. <template #orderItemList_form>
  906. <div></div>
  907. </template>
  908. </VbModal>
  909. <VbModal
  910. v-model:modal="modalItemRef"
  911. :title="itemOpts.modalTitle"
  912. :form-data="itemForm"
  913. :form-items="itemOpts.formItems"
  914. :label-width="itemOpts.labelWidth"
  915. append-to-body
  916. @confirm="submitItemForm"></VbModal>
  917. <VbModal
  918. v-model:modal="modalSendRef"
  919. :title="sendOpts.modalTitle"
  920. :form-data="sendForm"
  921. :form-items="sendOpts.formItems"
  922. :label-width="sendOpts.labelWidth"
  923. append-to-body
  924. @confirm="submitSendForm"></VbModal>
  925. <VbFeedbackModal ref="modalFeedbackRef"></VbFeedbackModal>
  926. <VbPayRecordModal ref="modalPayRecordRef"></VbPayRecordModal>
  927. <CustomerSelect
  928. ref="customerModalRef"
  929. :multiple="false"
  930. @confirm="handleConfirmCustomerModal"></CustomerSelect>
  931. <ExpectedProductionSelect
  932. ref="expectedProductionModalRef"
  933. :multiple="false"
  934. @confirm="handleConfirmExpectedProductionModal"></ExpectedProductionSelect>
  935. </div>
  936. </template>