SlaeOrderFormForm.vue 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711
  1. <template>
  2. <a-spin :spinning="loading">
  3. <JFormContainer :disabled="disabled">
  4. <template #detail>
  5. <a-form v-bind="formItemLayout" name="SaleOrderForm" ref="formRef">
  6. <a-row>
  7. <a-col :span="12">
  8. <a-form-item label="订单编号(bill code)" v-bind="validateInfos.billCode" id="SaleOrderForm-billCode" name="billCode" :labelCol="formItemLayout.labelCol1" :wrapperCol="formItemLayout.wrapperCol1">
  9. <a-input v-model:value="formData.billCode" placeholder="自动生成" disabled></a-input>
  10. </a-form-item>
  11. </a-col>
  12. <a-col :span="12">
  13. <a-form-item label="单据日期(bill date)" v-bind="validateInfos.billDate" id="SaleOrderForm-billDate" name="billDate">
  14. <a-date-picker placeholder="请选择单据日期(bill date)" v-model:value="formData.billDate" value-format="YYYY-MM-DD" style="width: 100%" allow-clear />
  15. </a-form-item>
  16. </a-col>
  17. <a-col :span="12">
  18. <a-form-item label="项目(project)" v-bind="validateInfos.projectName" id="SaleOrderForm-projectName" name="projectName" :labelCol="formItemLayout.labelCol1" :wrapperCol="formItemLayout.wrapperCol1">
  19. <a-input-search v-model:value="formData.projectName" placeholder="请输入项目(project)" :disabled="notAllowEdit" allow-clear enter-button="Search" AutoComplete="off" @search="onSearchProject"></a-input-search>
  20. </a-form-item>
  21. </a-col>
  22. <a-col :span="12">
  23. <a-form-item label="客户(customer)" v-bind="validateInfos.customerName" id="SaleOrderForm-customerName" name="customerName">
  24. <a-input v-model:value="formData.customerName" placeholder="请选择" allow-clear disabled></a-input>
  25. </a-form-item>
  26. </a-col>
  27. <a-col :span="12">
  28. <a-form-item label="中间人(intermediator)" v-bind="validateInfos.intermediator" id="SaleOrderForm-intermediator" name="intermediator" :labelCol="formItemLayout.labelCol1" :wrapperCol="formItemLayout.wrapperCol1">
  29. <a-input v-model:value="formData.intermediatorName" placeholder="请选择" allow-clear disabled></a-input>
  30. </a-form-item>
  31. </a-col>
  32. <a-col :span="12">
  33. <a-form-item label="优先级(priority)" v-bind="validateInfos.priority" id="SaleOrderForm-priority" name="priority">
  34. <JDictSelectTag v-model:value="formData.priority" placeholder="请选择" dictCode="priority" disabled/>
  35. </a-form-item>
  36. </a-col>
  37. <a-col :span="12">
  38. <a-form-item label="产品分类(production class)" v-bind="validateInfos.productionClass" id="SaleOrderForm-productionClass" name="productionClass" :labelCol="formItemLayout.labelCol1" :wrapperCol="formItemLayout.wrapperCol1">
  39. <ApiSelect
  40. :api="ClassList"
  41. showSearch
  42. v-model:value="formData.productionClass"
  43. optionFilterProp="label"
  44. resultField="records"
  45. labelField="name"
  46. valueField="id"
  47. disabled
  48. />
  49. </a-form-item>
  50. </a-col>
  51. <a-col :span="12">
  52. <a-form-item label="机型(model)" v-bind="validateInfos.model" id="SaleOrderForm-model" name="model">
  53. <JDictSelectTag v-model:value="formData.model" placeholder="请选择" dictCode="model_typer" disabled/>
  54. </a-form-item>
  55. </a-col>
  56. <a-col :span="12">
  57. <a-form-item label="厂家(maker)" v-bind="validateInfos.maker" id="SaleOrderForm-maker" name="maker" :labelCol="formItemLayout.labelCol1" :wrapperCol="formItemLayout.wrapperCol1">
  58. <a-input v-model:value="formData.maker" placeholder="请输入厂家(maker)" allow-clear disabled></a-input>
  59. </a-form-item>
  60. </a-col>
  61. <a-col :span="12">
  62. <a-form-item label="币种(currency)" v-bind="validateInfos.currency" id="SaleOrderForm-currency" name="currency">
  63. <JDictSelectTag v-model:value="formData.currency" placeholder="请选择" dictCode="currency" disabled/>
  64. </a-form-item>
  65. </a-col>
  66. <a-col :span="12">
  67. <a-form-item label="汇率(exchange rate)" v-bind="validateInfos.exchangeRate" id="SaleOrderForm-exchangeRate" name="exchangeRate" :labelCol="formItemLayout.labelCol1" :wrapperCol="formItemLayout.wrapperCol1">
  68. <a-input v-model:value="formData.exchangeRate" placeholder="请输入" allow-clear AutoComplete="off"></a-input>
  69. </a-form-item>
  70. </a-col>
  71. <a-col :span="12">
  72. <a-form-item label="交货条款(delivery term)" v-bind="validateInfos.deliveryTerms" id="SaleOrderForm-deliveryTerms" name="deliveryTerms">
  73. <JDictSelectTag v-model:value="formData.deliveryTerms" placeholder="请选择" dictCode="delivery_terms"/>
  74. </a-form-item>
  75. </a-col>
  76. <a-col :span="12">
  77. <a-form-item label="付款条件(payment terms)" v-bind="validateInfos.paymentTerms" id="SaleOrderForm-paymentTerms" name="paymentTerms" :labelCol="formItemLayout.labelCol1" :wrapperCol="formItemLayout.wrapperCol1">
  78. <JDictSelectTag v-model:value="formData.paymentTerms" placeholder="请选择" dictCode="payment_terms" disabled/>
  79. </a-form-item>
  80. </a-col>
  81. <a-col :span="12">
  82. <a-form-item label="交期(delivery time)" v-bind="validateInfos.deliveryTime" id="SaleOrderForm-deliveryTime" name="deliveryTime">
  83. <a-date-picker placeholder="请选择交期(delivery time)" v-model:value="formData.deliveryTime" value-format="YYYY-MM-DD" format="YYYY-MM-DD" @change="changeMainDeliveryTime" style="width: 100%" allow-clear />
  84. </a-form-item>
  85. </a-col>
  86. <a-col :span="12">
  87. <a-form-item label="发货方式(delivery)" v-bind="validateInfos.delivery" id="SaleOrderForm-delivery" name="delivery" :labelCol="formItemLayout.labelCol1" :wrapperCol="formItemLayout.wrapperCol1">
  88. <JDictSelectTag v-model:value="formData.delivery" placeholder="请选择" dictCode="delivery_sale_order" />
  89. </a-form-item>
  90. </a-col>
  91. <a-col :span="12">
  92. <a-form-item label="交货地点(delivery address)" v-bind="validateInfos.deliveryAddress" id="SaleOrderForm-deliveryAddress" name="deliveryAddress">
  93. <a-input v-model:value="formData.deliveryAddress" placeholder="请输入" AutoComplete="off"/>
  94. </a-form-item>
  95. </a-col>
  96. <a-col :span="12">
  97. <a-form-item label="开票抬头(invoice header)" v-bind="validateInfos.invoiceHeader" id="SaleOrderForm-invoiceHeader" name="invoiceHeader" :labelCol="formItemLayout.labelCol1" :wrapperCol="formItemLayout.wrapperCol1">
  98. <a-input v-model:value="formData.invoiceHeader" placeholder="请输入" AutoComplete="off"/>
  99. </a-form-item>
  100. </a-col>
  101. <a-col :span="12">
  102. <a-form-item label="开票地址(invoice address)" v-bind="validateInfos.invoiceAddress" id="SaleOrderForm-invoiceAddress" name="invoiceAddress" >
  103. <a-input v-model:value="formData.invoiceAddress" placeholder="请输入" AutoComplete="off"/>
  104. </a-form-item>
  105. </a-col>
  106. <a-col :span="12">
  107. <a-form-item label="包装要求(package requirement)" v-bind="validateInfos.packagebRequirement" id="SaleOrderForm-packagebRequirement" name="packagebRequirement" :labelCol="formItemLayout.labelCol1" :wrapperCol="formItemLayout.wrapperCol1">
  108. <a-input v-model:value="formData.packagebRequirement" placeholder="请输入包装要求(package requirement)" allow-clear AutoComplete="off"></a-input>
  109. </a-form-item>
  110. </a-col>
  111. <a-col :span="12">
  112. <a-form-item label="质保期(warranty period)" v-bind="validateInfos.warrantyPeriod" id="SaleOrderForm-warrantyPeriod" name="warrantyPeriod" >
  113. <a-input v-model:value="formData.warrantyPeriod" placeholder="请输入" style="width: 85%;margin-right: 1%;" AutoComplete="off"/>月(month)
  114. </a-form-item>
  115. </a-col>
  116. <a-col :span="12">
  117. <a-form-item label="是否出口(export)" v-bind="validateInfos.isExport" id="SaleOrderForm-isExport" name="isExport" :labelCol="formItemLayout.labelCol1" :wrapperCol="formItemLayout.wrapperCol1">
  118. <JDictSelectTag v-model:value="formData.isExport" placeholder="请选择" dictCode="yes_or_no" AutoComplete="off"/>
  119. </a-form-item>
  120. </a-col>
  121. <a-col :span="12">
  122. <a-form-item label="销售部门(sale department)" v-bind="validateInfos.saleDepartment" id="SaleOrderForm-saleDepartment" name="saleDepartment" >
  123. <a-input v-model:value="formData.saleDepartment" placeholder="请输入" allow-clear disabled ></a-input>
  124. </a-form-item>
  125. </a-col>
  126. <a-col :span="12">
  127. <a-form-item label="客户订单号(custormer order)" v-bind="validateInfos.customerOrder" id="SaleOrderForm-customerOrder" name="customerOrder" :labelCol="formItemLayout.labelCol1" :wrapperCol="formItemLayout.wrapperCol1">
  128. <a-input v-model:value="formData.customerOrder" placeholder="请输入客户订单号(custormer order number)" allow-clear AutoComplete="off"></a-input>
  129. </a-form-item>
  130. </a-col>
  131. <a-col :span="12">
  132. <a-form-item label="业务员(salesman)" v-bind="validateInfos.salesman" id="SaleOrderForm-salesman" name="salesman" >
  133. <a-input v-model:value="formData.salesman" placeholder="请输入业务员(salesman)" allow-clear disabled ></a-input>
  134. </a-form-item>
  135. </a-col>
  136. <a-col :span="12">
  137. <a-form-item label="折后金额(converted amount)" v-bind="validateInfos.convertedAmount" id="SaleOrderForm-convertedAmount" name="convertedAmount" :labelCol="formItemLayout.labelCol1" :wrapperCol="formItemLayout.wrapperCol1">
  138. <a-input v-model:value="formData.convertedAmount" placeholder="请输入折后金额(converted amount)" allow-clear disabled></a-input>
  139. </a-form-item>
  140. </a-col>
  141. <a-col :span="12">
  142. <a-form-item label="折上折(double discount)" v-bind="validateInfos.doubleDiscount" id="SaleOrderForm-doubleDiscount" name="doubleDiscount">
  143. <a-input v-model:value="formData.doubleDiscount" placeholder="请输入折上折(double discount)" allow-clear AutoComplete="off"></a-input>
  144. </a-form-item>
  145. </a-col>
  146. <a-col :span="12">
  147. <a-form-item label="质保条款(warranty terms)" v-bind="validateInfos.warrantyTerms" id="SaleOrderForm-warrantyTerms" name="warrantyTerms" :labelCol="formItemLayout.labelCol1" :wrapperCol="formItemLayout.wrapperCol1">
  148. <a-input v-model:value="formData.warrantyTerms" placeholder="请输入质保条款(warranty terms)" allow-clear AutoComplete="off"></a-input>
  149. </a-form-item>
  150. </a-col>
  151. <a-col :span="12">
  152. <a-form-item label="预付比例(advance ratio)" v-bind="validateInfos.advanceRatio" id="SaleOrderForm-advanceRatio" name="advanceRatio" >
  153. <a-input v-model:value="formData.advanceRatio" placeholder="请输入" allow-clear AutoComplete="off"></a-input>
  154. </a-form-item>
  155. </a-col>
  156. <a-col :span="12">
  157. <a-form-item label="备注(notes)" v-bind="validateInfos.notes" id="SaleOrderForm-notes" name="notes" :labelCol="formItemLayout.labelCol1" :wrapperCol="formItemLayout.wrapperCol1">
  158. <a-input v-model:value="formData.notes" AutoComplete="off"></a-input>
  159. </a-form-item>
  160. </a-col>
  161. <a-col :span="12">
  162. <a-form-item label="附件(attachs)" v-bind="validateInfos.attachs" id="SaleOrderForm-attachs" name="attachs">
  163. <JUpload v-model:value="formData.attachs"></JUpload>
  164. </a-form-item>
  165. </a-col>
  166. </a-row>
  167. </a-form>
  168. </template>
  169. </JFormContainer>
  170. <!-- 子表单区域 -->
  171. <a-tabs v-model:activeKey="activeKey" animated style=" padding: 24px;padding-top: 0px;">
  172. <a-tab-pane tab="销售订单 - 产品明细(product details)" key="SaleOrderFormShipFormProduct" :forceRender="true">
  173. <a-button type="primary" style="margin-right: 1%;margin-bottom: 1%;" @click="selectProductList"> 选择产品(select product)</a-button>
  174. <a-button type="primary" style="margin-right: 1%;margin-bottom: 1%;" @click ="selectContractList"> 选择合同(select contract)</a-button>
  175. <a-button type="primary" style="margin-right: 1%;margin-bottom: 1%;" @click ="selectQuotationList"> 选择报价单(select quotation)</a-button>
  176. <j-vxe-table
  177. :keep-source="true"
  178. resizable
  179. ref="SaleOrderFormShipFormProductTableRef"
  180. :loading="SaleOrderFormShipFormProductTable.loading"
  181. :columns="SaleOrderFormShipFormProductTable.columns"
  182. :dataSource="SaleOrderFormShipFormProductTable.dataSource"
  183. :height="340"
  184. :disabled="disabled"
  185. :rowNumber="true"
  186. :rowSelection="true"
  187. asyncRemove
  188. @valueChange="changeValues"
  189. >
  190. <template #action="props">
  191. <a-popconfirm title="确定删除吗?" @confirm="handleDelete(props)">
  192. <a>删除(delete)</a>
  193. </a-popconfirm>
  194. </template>
  195. </j-vxe-table>
  196. </a-tab-pane>
  197. <a-tab-pane tab="销售订单 - 船明细(ship details)" key="SaleOrderFormShipFormShip" :forceRender="true">
  198. <j-vxe-table
  199. :keep-source="true"
  200. resizable
  201. ref="SaleOrderFormShipFormShipTableRef"
  202. :loading="SaleOrderFormShipFormShipTable.loading"
  203. :columns="SaleOrderFormShipFormShipTable.columns"
  204. :dataSource="SaleOrderFormShipFormShipTable.dataSource"
  205. :height="340"
  206. :disabled="disabled"
  207. :rowNumber="true"
  208. :rowSelection="true"
  209. >
  210. <template #action="props" >
  211. <a @click="viewAccessory(props)">查看配件信息(view accessory information)</a>
  212. </template>
  213. </j-vxe-table>
  214. </a-tab-pane>
  215. </a-tabs>
  216. <SelectPrpductModal ref="SelectPrpductModalRef" @selectProduct ='addProduct'></SelectPrpductModal>
  217. <SelectContractModal ref="SelectContractModalRef" @selectContract="addContract"></SelectContractModal>
  218. <SelectQuotationModal ref="SelectQuotationModalRef" @selectQuotation="addQuotation"></SelectQuotationModal>
  219. <SelectProjectModal ref="SelectProjectModalRef" @selectProject="addProject"></SelectProjectModal>
  220. <BaseShipArchiveAccessoriesModal ref="BaseShipArchiveAccessoriesModalRef"></BaseShipArchiveAccessoriesModal>
  221. </a-spin>
  222. </template>
  223. <script lang="ts">
  224. import { defineComponent, ref, reactive, computed, toRaw,nextTick} from 'vue';
  225. import { defHttp } from '/@/utils/http/axios';
  226. import { useValidateAntFormAndTable } from '/@/hooks/system/useJvxeMethods';
  227. import { querySaleOrderFormShipFormShippTable,ClassList, querySaleOrderFormProductListByMainId, queryDataById, saveOrUpdate,queryVersonHistoryById,querysaleVersonFormShipListByMainId, querySaleVersonProductListByMainId} from '../SaleOrderyForm.api';
  228. import { JVxeTable } from '/@/components/jeecg/JVxeTable';
  229. import {saleOrderShipColumns, saleOrderProductColumns} from '../SaleOrderForm.data';
  230. import SelectPrpductModal from '../../../publicComponents/SelectPrpductModal.vue';
  231. import SelectContractModal from '../../../publicComponents/SelectContractModal.vue';
  232. import SelectQuotationModal from '../../../publicComponents/SelectQuotationModal.vue';
  233. import SelectProjectModal from '../../../publicComponents/SelectProjectModal.vue';
  234. import BaseShipArchiveAccessoriesModal from '../../../publicComponents/BaseShipArchiveAccessoriesModal.vue';
  235. import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';
  236. import JUpload from '/@/components/Form/src/jeecg/components/JUpload/JUpload.vue';
  237. import { JDictSelectTag} from '/@/components/Form';
  238. import JSelectInput from '/@/components/Form/src/jeecg/components/JSelectInput.vue';
  239. import { Form, message } from 'ant-design-vue';
  240. import { useUserStore } from '/@/store/modules/user';
  241. import { ApiSelect, } from '/@/components/Form/index';
  242. import moment from 'moment';
  243. import { InputNumberItem } from '/@/layouts/default/setting/components';
  244. const useForm = Form.useForm;
  245. export default defineComponent({
  246. name: "SaleOrderForm",
  247. components:{
  248. JVxeTable,
  249. JFormContainer,
  250. SelectPrpductModal,
  251. SelectContractModal,
  252. JUpload,
  253. JDictSelectTag,
  254. JSelectInput,
  255. SelectQuotationModal,
  256. SelectProjectModal,
  257. BaseShipArchiveAccessoriesModal,
  258. ApiSelect
  259. },
  260. props:{
  261. formDisabled:{
  262. type: Boolean,
  263. default: false
  264. },
  265. formData: { type: Object, default: ()=>{} },
  266. formBpm: { type: Boolean, default: true }
  267. },
  268. emits:['success'],
  269. setup(props, {emit}) {
  270. const userStore = useUserStore();
  271. const loading = ref(false);
  272. const formRef = ref();
  273. const SaleOrderFormShipFormShipTableRef = ref();
  274. const SelectPrpductModalRef = ref()
  275. const SelectContractModalRef = ref()
  276. const SelectQuotationModalRef = ref()
  277. const SelectProjectModalRef = ref()
  278. const BaseShipArchiveAccessoriesModalRef = ref();
  279. const SaleOrderFormShipFormShipTable = reactive<Record<string, any>>({
  280. loading: false,
  281. columns: saleOrderShipColumns,
  282. dataSource: []
  283. });
  284. const SaleOrderFormShipFormProductTableRef = ref();
  285. const SaleOrderFormShipFormProductTable = reactive<Record<string, any>>({
  286. loading: false,
  287. columns: saleOrderProductColumns,
  288. dataSource: []
  289. });
  290. const activeKey = ref('SaleOrderFormShipFormProduct');
  291. var notAllowEdit = ref(false);
  292. const formData = reactive<Record<string, any>>({
  293. id: '',
  294. status: undefined,
  295. delFlag: undefined,
  296. billCode:'',
  297. billDate: moment(new Date()).format('YYYY-MM-DD'),
  298. project: '',
  299. projectName:'',
  300. customer:"",
  301. customerName:'',
  302. intermediator: '',
  303. intermediatorName:'',
  304. priority: '',
  305. productionClass: '',
  306. model: '',
  307. maker: '',
  308. deliveryTerms:'',
  309. paymentTerms:'',
  310. delivery:'',
  311. deliveryTime: '',
  312. deliveryAddress:'',
  313. invoiceHeader:'',
  314. invoiceAddress:'',
  315. warrantyPeriod: '',
  316. isExport:'',
  317. packagebRequirement:'',
  318. saleDepartment:'',
  319. salesman:'',
  320. customerOrder:'',
  321. doubleDiscount:'',
  322. convertedAmount:'',
  323. warrantyTerms:'',
  324. advanceRatio:'',
  325. notes:'',
  326. attachs:'',
  327. sourceCode:'',
  328. sourceCode2:'',
  329. currency:'',
  330. exchangeRate:'',
  331. submit:undefined,
  332. });
  333. //表单验证
  334. const validatorRules = reactive({
  335. });
  336. const {resetFields, validate, validateInfos} = useForm(formData, validatorRules, {immediate: false});
  337. const dbData = {};
  338. const formItemLayout = {
  339. labelCol: {xs: {span: 24}, sm: {span: 5}},
  340. wrapperCol: {xs: {span: 24}, sm: {span: 16}},
  341. labelCol1: {xs: {span: 24}, sm: {span: 6}},
  342. wrapperCol1: {xs: {span: 24}, sm: {span: 16}},
  343. };
  344. // 表单禁用
  345. const disabled = computed(()=>{
  346. if(props.formBpm === true){
  347. if(props.formData.disabled === false){
  348. return false;
  349. }else{
  350. return true;
  351. }
  352. }
  353. return props.formDisabled;
  354. });
  355. function add() {
  356. resetFields();
  357. SaleOrderFormShipFormShipTable.dataSource = [];
  358. SaleOrderFormShipFormProductTable.dataSource = [];
  359. activeKey.value = 'SaleOrderFormShipFormProduct'
  360. formData.salesman=userStore.getUserInfo.username;
  361. formData.saleDepartment = userStore.getUserInfo.orgCode
  362. }
  363. async function copy(data,id){
  364. //主表数据
  365. await queryMainData(id);
  366. formData.id = ''
  367. formData.billCode = ''
  368. //子表数据
  369. const SaleOrderFormShipFormShipDataList = await querySaleOrderFormShipFormShippTable(id);
  370. SaleOrderFormShipFormShipTable.dataSource = [...SaleOrderFormShipFormShipDataList];
  371. SaleOrderFormShipFormProductTable.dataSource = [...data];
  372. isSelect()
  373. }
  374. // 判断有没有参照的子表
  375. function isSelect(){
  376. var arrQuo = [],
  377. arrCon=[]
  378. if(SaleOrderFormShipFormProductTable.dataSource)
  379. SaleOrderFormShipFormProductTable.dataSource.map(item=>{
  380. var sign = ''
  381. sign = item.sourceType ?(item.sourceType).substring(0, 3):''
  382. if(item.sourceType&&sign=='Quo'){
  383. arrQuo.push(item.sourceType)
  384. }else if(item.sourceType&&sign=='Con'){
  385. arrCon.push(item.sourceType)
  386. }
  387. })
  388. if(arrQuo.length==0&&arrCon.length==0){
  389. formData.sourceCode2 = ''
  390. formData.sourceCode = ''
  391. notAllowEdit.value=false
  392. }else if(arrQuo.length==0){
  393. formData.sourceCode = ''
  394. notAllowEdit.value=true
  395. }else if(arrCon.length==0){
  396. formData.sourceCode2 = ''
  397. notAllowEdit.value=true
  398. }
  399. }
  400. async function edit(row) {
  401. //主表数据
  402. await queryMainData(row.id);
  403. //子表数据
  404. const SaleOrderFormShipFormShipDataList = await querySaleOrderFormShipFormShippTable(row['id']);
  405. SaleOrderFormShipFormShipTable.dataSource = [...SaleOrderFormShipFormShipDataList];
  406. const SaleOrderFormShipFormProductDataList = await querySaleOrderFormProductListByMainId(row['id']);
  407. SaleOrderFormShipFormProductTable.dataSource = [...SaleOrderFormShipFormProductDataList];
  408. notAllowEdit.value=true
  409. }
  410. async function queryMainData(id) {
  411. const row = await queryDataById(id);
  412. resetFields();
  413. const tmpData = {};
  414. Object.keys(formData).forEach((key) => {
  415. if(row.hasOwnProperty(key)){
  416. tmpData[key] = row[key]
  417. }
  418. })
  419. //赋值
  420. Object.assign(formData,tmpData);
  421. }
  422. //查看版本详情
  423. async function VersionDetail(record){
  424. //主表数据
  425. await queryVersonHistoryData(record.id);
  426. //子表数据
  427. const SaleOrderFormShipFormShipDataList = await querysaleVersonFormShipListByMainId(record.id);
  428. SaleOrderFormShipFormShipTable.dataSource = [...SaleOrderFormShipFormShipDataList];
  429. const SaleOrderFormShipFormProductDataList = await querySaleVersonProductListByMainId(record.id);
  430. SaleOrderFormShipFormProductTable.dataSource = [...SaleOrderFormShipFormProductDataList];
  431. }
  432. async function queryVersonHistoryData(id){
  433. const row = await queryVersonHistoryById(id);
  434. resetFields();
  435. const tmpData = {};
  436. Object.keys(formData).forEach((key) => {
  437. if(row.hasOwnProperty(key)){
  438. tmpData[key] = row[key]
  439. }
  440. })
  441. //赋值
  442. Object.assign(formData,tmpData);
  443. }
  444. const {getSubFormAndTableData, transformData} = useValidateAntFormAndTable(activeKey, {
  445. 'saleOrderShip': SaleOrderFormShipFormShipTableRef,
  446. 'saleOrderProduct': SaleOrderFormShipFormProductTableRef,
  447. });
  448. async function getFormData() {
  449. try {
  450. // 触发表单验证
  451. await validate();
  452. } catch ({ errorFields }) {
  453. if (errorFields) {
  454. const firstField = errorFields[0];
  455. if (firstField) {
  456. formRef.value.scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });
  457. }
  458. }
  459. return Promise.reject(errorFields);
  460. }
  461. return transformData(toRaw(formData))
  462. }
  463. async function submitForm() {
  464. if(formData.sourceCode==''&&formData.sourceCode2==''){
  465. message.warning('请选择合同或报价单')
  466. }else{
  467. const mainData = await getFormData();
  468. const subData = await getSubFormAndTableData();
  469. const values = Object.assign({}, dbData, mainData, subData);
  470. console.log('表单提交数据', values)
  471. const isUpdate = values.id ? true : false
  472. const isRevise = values.submit=='1' ? true : false
  473. await saveOrUpdate(values, isUpdate,isRevise);
  474. //关闭弹窗
  475. emit('success');
  476. }
  477. }
  478. function setFieldsValue(values) {
  479. if(values){
  480. Object.keys(values).map(k=>{
  481. formData[k] = values[k];
  482. });
  483. }
  484. }
  485. function selectProductList(){
  486. SelectPrpductModalRef.value.getTable()
  487. }
  488. function selectContractList(){
  489. SelectContractModalRef.value.getTable(formData)
  490. }
  491. function selectQuotationList(){
  492. SelectQuotationModalRef.value.getTable(formData)
  493. }
  494. function onSearchProject(){
  495. SelectProjectModalRef.value.getTable()
  496. }
  497. function addProduct(data){
  498. data.map(item=>{
  499. item.productClass = item.classId_dictText
  500. item.productCode = item.code
  501. item.deliveryTime = formData.deliveryTime
  502. item.productId = item.id
  503. })
  504. var arrProduct = data.concat(SaleOrderFormShipFormProductTable.dataSource)
  505. SaleOrderFormShipFormProductTable.dataSource=arrProduct
  506. }
  507. function addQuotation(data){
  508. var allDiscountPrice = 0
  509. data.map(item=>{
  510. item.model = item.childModel
  511. item.deliveryTime = formData.deliveryTime
  512. item.sourceId = item.childId
  513. item.sourceType = 'Quo'+item.childId
  514. item.taxPrice = item.salePrice
  515. item.discountedPrice = (Number(item.taxPrice) *(1-Number(item.discount)/100))
  516. item.discountedAmount =Number(item.discountedPrice) *Number(item.quantity)
  517. item.discountedPrice = (item.discountedPrice).toFixed(2)
  518. item.discountedAmount = (item.discountedAmount).toFixed(2)
  519. allDiscountPrice=allDiscountPrice+Number(item.discountedAmount)
  520. })
  521. var arrProduct = data.concat(SaleOrderFormShipFormProductTable.dataSource)
  522. notAllowEdit.value=true
  523. SaleOrderFormShipFormProductTable.dataSource=arrProduct
  524. formData.sourceCode =data[0].billCode
  525. formData.convertedAmount=allDiscountPrice
  526. if(!formData.sourceCode2&&formData.sourceCode2==''){
  527. formData.project = data[0].quotationProject
  528. formData.projectName = data[0].quotationProjectName
  529. formData.customer =data[0].quotationCustomer
  530. formData.customerName =data[0].quotationCustomerName
  531. formData.priority =data[0].priority
  532. formData.productionClass =data[0].productionClass
  533. formData.model =data[0].headModel
  534. formData.maker =data[0].maker
  535. formData.currency =data[0].currency
  536. formData.paymentTerms =data[0].paymentTerms
  537. formData.intermediator =data[0].intermediator
  538. formData.intermediatorName =data[0].intermediatorName
  539. getShipList(data[0].headId,'quotation')
  540. }
  541. }
  542. function addContract(data){
  543. var allDiscountPrice = 0
  544. data.map(item=>{
  545. item.model = item.childModel
  546. item.deliveryTime = formData.deliveryTime
  547. item.sourceId = item.childId
  548. item.sourceType = 'Con'+item.childId
  549. item.discountedPrice =Number(item.taxPrice)*(1-Number(item.discount)/100)
  550. item.discountedAmount =Number(item.discountedPrice) *Number(item.quantity)
  551. item.discountedPrice = (item.discountedPrice).toFixed(2)
  552. item.discountedAmount = (item.discountedAmount).toFixed(2)
  553. allDiscountPrice=allDiscountPrice+Number(item.discountedAmount)
  554. })
  555. var arrProduct = data.concat(SaleOrderFormShipFormProductTable.dataSource)
  556. notAllowEdit.value=true
  557. SaleOrderFormShipFormProductTable.dataSource=arrProduct
  558. formData.sourceCode2 =data[0].billCode
  559. formData.convertedAmount=allDiscountPrice
  560. if(!formData.sourceCode&&formData.sourceCode==''){
  561. formData.project = data[0].quotationProject
  562. formData.projectName = data[0].quotationProjectName
  563. formData.customer =data[0].quotationCustomer
  564. formData.customerName =data[0].quotationCustomerName
  565. formData.priority =data[0].priority
  566. formData.productionClass =data[0].productionClass
  567. formData.model =data[0].headModel
  568. formData.maker =data[0].maker
  569. formData.currency =data[0].currency
  570. formData.paymentTerms =data[0].paymentTerms
  571. formData.intermediator =data[0].intermediator
  572. formData.intermediatorName =data[0].intermediatorName
  573. getShipList(data[0].headId,'contract')
  574. }
  575. }
  576. function getShipList(id,status){
  577. let params = {id:id}
  578. let url = status=='quotation'?'/saleCode/saleQuotation/querySaleQuotationShipByMainId':'/saleCode/saleContract/querySaleContractShipByMainId'
  579. defHttp.get({url:url,params}, { isTransformResponse: false }).then(res=>{
  580. if(res){
  581. SaleOrderFormShipFormShipTable.dataSource = res.result
  582. }
  583. })
  584. }
  585. function addProject(data){
  586. formData.project = data[0].id
  587. formData.projectName = data[0].name
  588. formData.customer =data[0].customerId
  589. formData.customerName =data[0].customerId_dictText
  590. }
  591. function changeMainDeliveryTime(prop){
  592. if(SaleOrderFormShipFormProductTable.dataSource.length>0){
  593. var newArr = [...SaleOrderFormShipFormProductTable.dataSource]
  594. newArr.map(item=>{
  595. item.deliveryTime = prop
  596. })
  597. SaleOrderFormShipFormProductTable.dataSource = newArr
  598. }
  599. }
  600. //查看配件信息
  601. function viewAccessory(prop){
  602. BaseShipArchiveAccessoriesModalRef.value.getTable(prop.row)
  603. }
  604. //产品明细-删除行
  605. function handleDelete(prop) {
  606. var newArray = [...SaleOrderFormShipFormProductTable.dataSource]
  607. newArray.splice(prop.rowIndex, 1)
  608. SaleOrderFormShipFormProductTable.dataSource = newArray
  609. isSelect()
  610. }
  611. function changeValues(prop){
  612. if(prop.col.key=='discountedPrice'&&prop.row.quantity&&prop.row.discountedPrice){
  613. prop.row.discountedAmount = (prop.value*prop.row.quantity).toFixed(2)
  614. var arr=SaleOrderFormShipFormProductTableRef.value.getTableData()
  615. var allAmount = 0
  616. arr.map(item=>{
  617. allAmount = allAmount+Number(item.discountedAmount)
  618. })
  619. formData.convertedAmount=allAmount
  620. }
  621. }
  622. /**
  623. * 值改变事件触发-树控件回调
  624. * @param key
  625. * @param value
  626. */
  627. function handleFormChange(key, value) {
  628. formData[key] = value;
  629. }
  630. return {
  631. SaleOrderFormShipFormShipTableRef,
  632. SaleOrderFormShipFormShipTable,
  633. SaleOrderFormShipFormProductTableRef,
  634. SaleOrderFormShipFormProductTable,
  635. validatorRules,
  636. validateInfos,
  637. activeKey,
  638. loading,
  639. formData,
  640. setFieldsValue,
  641. handleFormChange,
  642. formItemLayout,
  643. disabled,
  644. getFormData,
  645. submitForm,
  646. add,
  647. edit,
  648. copy,
  649. formRef,
  650. selectProductList,
  651. SelectPrpductModalRef,
  652. addProduct,
  653. SelectContractModalRef,
  654. selectContractList,
  655. addContract,
  656. SelectQuotationModalRef,
  657. selectQuotationList,
  658. addQuotation,
  659. onSearchProject,
  660. SelectProjectModalRef,
  661. addProject,
  662. changeMainDeliveryTime,
  663. handleDelete,
  664. BaseShipArchiveAccessoriesModalRef,
  665. viewAccessory,
  666. VersionDetail,
  667. notAllowEdit,
  668. ClassList,
  669. changeValues
  670. }
  671. }
  672. });
  673. </script>
  674. <style lang="less" scoped>
  675. /** 时间和数字输入框样式 */
  676. :deep(.ant-input-number) {
  677. width: 100%;
  678. }
  679. :deep(.ant-calendar-picker) {
  680. width: 100%;
  681. }
  682. /deep/.vxe-table--body-wrapper{
  683. height: 100% !important;
  684. }
  685. /deep/.ant-modal-body{
  686. padding: 24px !important;
  687. }
  688. /deep/.ant-form-item{
  689. margin-bottom: 8px !important;
  690. }
  691. </style>