AfterPurchaseOrderFormForm.vue 44 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136
  1. <template>
  2. <a-spin :spinning="loading">
  3. <JFormContainer :disabled="disabled">
  4. <template #detail>
  5. <a-form v-bind="formItemLayout" name="PurchaseOrderFormModal" ref="formRef">
  6. <a-row>
  7. <a-col :span="12">
  8. <a-form-item label="组织(organize)" v-bind="validateInfos.organize" id="PurchaseOrderFormModal-organize" name="organize">
  9. <!-- <a-select v-model:value="formData.organize" :disabled="formData.id !== '' && formData.submit == '1'"> -->
  10. <a-select v-model:value="formData.organize" >
  11. <a-select-option value="上海">上海</a-select-option>
  12. <a-select-option value="香港">香港</a-select-option>
  13. </a-select>
  14. </a-form-item>
  15. </a-col>
  16. <a-col :span="12">
  17. <a-form-item label="订单编号(bill code)" v-bind="validateInfos.billCode" id="PurchaseOrderFormModal-billCode" name="billCode">
  18. <a-input v-model:value="formData.billCode" placeholder="自动生成" disabled />
  19. </a-form-item>
  20. </a-col>
  21. <a-col :span="12">
  22. <a-form-item label="单据日期(bill date)" v-bind="validateInfos.billDate" id="PurchaseOrderFormModal-billDate" name="billDate">
  23. <a-date-picker
  24. placeholder="请选择单据日期(bill date)"
  25. v-model:value="formData.billDate"
  26. value-format="YYYY-MM-DD"
  27. style="width: 100%"
  28. allow-clear
  29. />
  30. </a-form-item>
  31. </a-col>
  32. <a-col :span="12">
  33. <a-form-item label="项目(project)" v-bind="validateInfos.projectName" id="PurchaseOrderFormModal-projectName" name="projectName">
  34. <a-input-search
  35. v-model:value="formData.projectName"
  36. placeholder="请输入项目(project)"
  37. readonly
  38. :disabled="notAllowEdit"
  39. allow-clear
  40. enter-button="Search"
  41. AutoComplete="off"
  42. @search="onSearchProject"
  43. />
  44. </a-form-item>
  45. </a-col>
  46. <a-col :span="12">
  47. <a-form-item label="供应商(supplier)" v-bind="validateInfos.supplier" id="PurchaseOrderFormModal-supplier" name="supplier">
  48. <ApiSelect
  49. :api="supplierOption"
  50. showSearch
  51. v-model:value="formData.supplier"
  52. optionFilterProp="label"
  53. resultField="records"
  54. labelField="name"
  55. valueField="id"
  56. disabled
  57. :params="{ pageSize: -1, status: 1 }"
  58. />
  59. </a-form-item>
  60. </a-col>
  61. <a-col :span="12">
  62. <a-form-item label="优先级(priority)" v-bind="validateInfos.priority" id="PurchaseOrderFormModal-priority" name="priority">
  63. <JDictSelectTag v-model:value="formData.priority" placeholder="请选择" dictCode="priority" disabled />
  64. </a-form-item>
  65. </a-col>
  66. <a-col :span="12">
  67. <a-form-item
  68. label="产品分类(production class)"
  69. v-bind="validateInfos.productionClass"
  70. id="PurchaseOrderFormModal-productionClass"
  71. name="productionClass"
  72. >
  73. <ApiSelect
  74. :api="ClassList"
  75. showSearch
  76. v-model:value="formData.productionClass"
  77. optionFilterProp="label"
  78. resultField="records"
  79. labelField="name"
  80. valueField="id"
  81. disabled
  82. :params="{ pageSize: -1 }"
  83. />
  84. </a-form-item>
  85. </a-col>
  86. <a-col :span="12">
  87. <a-form-item label="机型(model)" v-bind="validateInfos.model" id="PurchaseOrderFormModal-model" name="model">
  88. <JDictSelectTag v-model:value="formData.model" placeholder="请选择" dictCode="model_typer" disabled />
  89. </a-form-item>
  90. </a-col>
  91. <a-col :span="12">
  92. <a-form-item label="厂家(maker)" v-bind="validateInfos.maker" id="PurchaseOrderFormModal-maker" name="maker">
  93. <a-input v-model:value="formData.maker" placeholder="请输入厂家(maker)" allow-clear disabled />
  94. </a-form-item>
  95. </a-col>
  96. <a-col :span="12">
  97. <a-form-item label="贸易条款(trade term)" v-bind="validateInfos.tradeTerms" id="PurchaseOrderFormModal-tradeTerms" name="tradeTerms">
  98. <JDictSelectTag v-model:value="formData.tradeTerms" placeholder="请选择" dictCode="delivery_terms" />
  99. </a-form-item>
  100. </a-col>
  101. <a-col :span="12">
  102. <a-form-item label="是否出口(export)" v-bind="validateInfos.isExport" id="PurchaseOrderFormModal-isExport" name="isExport">
  103. <JDictSelectTag v-model:value="formData.isExport" placeholder="请选择" dictCode="yes_or_no" />
  104. </a-form-item>
  105. </a-col>
  106. <a-col :span="12">
  107. <a-form-item
  108. label="包装要求(package requirement)"
  109. v-bind="validateInfos.packagebRequirement"
  110. id="PurchaseOrderFormModal-packagebRequirement"
  111. name="packagebRequirement"
  112. >
  113. <a-input
  114. v-model:value="formData.packagebRequirement"
  115. placeholder="请输入包装要求(package requirement)"
  116. allow-clear
  117. AutoComplete="off"
  118. />
  119. </a-form-item>
  120. </a-col>
  121. <!-- <a-col :span="12">
  122. <a-form-item label="收件人(recipient)" v-bind="validateInfos.recipient" id="PurchaseOrderFormModal-recipient" name="recipient">
  123. <a-input v-model:value="formData.recipient" placeholder="请输入" AutoComplete="off" />
  124. </a-form-item>
  125. </a-col> -->
  126. <a-col :span="12">
  127. <a-form-item label="运输方式(transport)" v-bind="validateInfos.transport" id="PurchaseOrderFormModal-transport" name="transport">
  128. <JDictSelectTag v-model:value="formData.transport" placeholder="请选择" dictCode="delivery_methods" />
  129. </a-form-item>
  130. </a-col>
  131. <!-- <a-col :span="12">
  132. <a-form-item
  133. label="收件人地址(recipient address)"
  134. v-bind="validateInfos.recipientAddress"
  135. id="PurchaseOrderFormModal-recipientAddress"
  136. name="recipientAddress"
  137. >
  138. <a-input v-model:value="formData.recipientAddress" placeholder="请输入" AutoComplete="off" />
  139. </a-form-item>
  140. </a-col> -->
  141. <a-col :span="12">
  142. <a-form-item
  143. label="付款条件(payment terms)"
  144. v-bind="validateInfos.paymentTerms"
  145. id="PurchaseOrderFormModal-paymentTerms"
  146. name="paymentTerms"
  147. >
  148. <JDictSelectTag v-model:value="formData.paymentTerms" placeholder="请选择" dictCode="payment_terms" />
  149. </a-form-item>
  150. </a-col>
  151. <!-- <a-col :span="12">
  152. <a-form-item label="收件人电话(recipient tel)" v-bind="validateInfos.recipientTel" id="PurchaseOrderFormModal-recipientTel" name="recipientTel">
  153. <a-input v-model:value="formData.recipientTel" placeholder="请输入" AutoComplete="off" />
  154. </a-form-item>
  155. </a-col> -->
  156. <a-col :span="12">
  157. <a-form-item label="发货方式(delivery)" v-bind="validateInfos.delivery" id="PurchaseOrderFormModal-delivery" name="delivery">
  158. <JDictSelectTag v-model:value="formData.delivery" placeholder="请选择" dictCode="delivery_sale_order" />
  159. </a-form-item>
  160. </a-col>
  161. <a-col :span="12">
  162. <a-form-item
  163. label="质保期(warranty period)"
  164. v-bind="validateInfos.warrantyPeriod"
  165. id="PurchaseOrderFormModal-warrantyPeriod"
  166. name="warrantyPeriod"
  167. >
  168. <a-input
  169. v-model:value="formData.warrantyPeriod"
  170. placeholder="请输入"
  171. style="width: 85%; margin-right: 1%"
  172. AutoComplete="off"
  173. />月(month)
  174. </a-form-item>
  175. </a-col>
  176. <a-col :span="12">
  177. <a-form-item
  178. label="质保条款(warranty terms)"
  179. v-bind="validateInfos.warrantyTerms"
  180. id="PurchaseOrderFormModal-warrantyTerms"
  181. name="warrantyTerms"
  182. >
  183. <a-input v-model:value="formData.warrantyTerms" placeholder="请输入质保条款(warranty terms)" allow-clear AutoComplete="off" />
  184. </a-form-item>
  185. </a-col>
  186. <a-col :span="12">
  187. <a-form-item label="采购员(purchasesman)" v-bind="validateInfos.purchaseman" id="PurchaseOrderFormModal-purchaseman" name="purchaseman">
  188. <a-input v-model:value="formData.purchasemanName" placeholder="请输入采购员(salesman)" allow-clear disabled />
  189. </a-form-item>
  190. </a-col>
  191. <a-col :span="12">
  192. <a-form-item label="币种(currency)" v-bind="validateInfos.currency" id="PurchaseOrderFormModal-currency" name="currency">
  193. <JDictSelectTag :disabled="!hasPermission('purCode:pur_order:editBZ')" :showChooseOption='false' v-model:value="formData.currency" dictCode="currency" @change="handleChangeCurrency" />
  194. </a-form-item>
  195. </a-col>
  196. <a-col :span="12">
  197. <a-form-item
  198. label="采购部门(purchase department)"
  199. v-bind="validateInfos.purchaseDepartment"
  200. id="PurchaseOrderFormModal-purchaseDepartment"
  201. name="purchaseDepartment"
  202. >
  203. <a-input v-model:value="formData.purchaseDepartmentName" placeholder="请输入" allow-clear disabled />
  204. </a-form-item>
  205. </a-col>
  206. <a-col :span="12">
  207. <a-form-item
  208. label="汇率(exchange rate)"
  209. v-bind="validateInfos.exchangeRate"
  210. id="PurchaseOrderFormModal-exchangeRate"
  211. name="exchangeRate"
  212. >
  213. <a-input v-model:value="formData.exchangeRate" placeholder="请输入" allow-clear AutoComplete="off" disabled />
  214. </a-form-item>
  215. </a-col>
  216. <a-col :span="12">
  217. <a-form-item
  218. label="折扣(discountHead)"
  219. v-bind="validateInfos.discountHead"
  220. id="PurchaseOrderFormModal-discountHead"
  221. name="discountHead"
  222. >
  223. <a-input-number
  224. v-model:value="formData.discountHead"
  225. placeholder="请输入折扣(discountHead)"
  226. :min="0"
  227. :max="100"
  228. @blur="discountHeadChange"
  229. />
  230. </a-form-item>
  231. </a-col>
  232. <a-col :span="12">
  233. <a-form-item
  234. label="折后金额(discounted amount)"
  235. v-bind="validateInfos.discountAmount"
  236. id="PurchaseOrderFormModal-discountAmount"
  237. name="discountAmount"
  238. >
  239. <a-input v-model:value="formData.discountAmount" allow-clear disabled />
  240. </a-form-item>
  241. </a-col>
  242. <a-col :span="12">
  243. <a-form-item label="备注(notes)" v-bind="validateInfos.notes" id="PurchaseOrderFormModal-notes" name="notes">
  244. <a-input v-model:value="formData.notes" AutoComplete="off" />
  245. </a-form-item>
  246. </a-col>
  247. <a-col :span="12">
  248. <a-form-item
  249. label="收件人地址(recipient address)"
  250. v-bind="validateInfos.recipientAddress"
  251. id="SaleOrderForm-recipientAddress"
  252. name="recipientAddress"
  253. >
  254. <a-textarea v-model:value="formData.recipientAddress" AutoComplete="off" :rows="2" />
  255. </a-form-item>
  256. </a-col>
  257. <a-col :span="12">
  258. <!-- <a-form-item
  259. label="协议条款(agreement terms)"
  260. v-bind="validateInfos.agreementTerms"
  261. id="PurchaseOrderFormModal-agreementTerms"
  262. name="agreementTerms"
  263. >
  264. <JSelectMultiple
  265. v-model:value="formData.agreementTerms"
  266. placeholder=""
  267. dictCode="base_agreement_terms,name,name"
  268. page="false"
  269. showSearch
  270. />
  271. </a-form-item> -->
  272. <a-form-item
  273. label="表尾备注"
  274. v-bind="validateInfos.agreementTerms"
  275. id="PurchaseOrderFormModal-agreementTerms"
  276. name="agreementTerms"
  277. :labelCol="formItemLayout.labelCol1"
  278. :wrapperCol="formItemLayout.wrapperCol1"
  279. >
  280. <a-textarea v-model:value="formData.agreementTerms" placeholder="" allow-clear AutoComplete="off" />
  281. </a-form-item>
  282. </a-col>
  283. <a-col :span="12">
  284. <a-form-item label="附件(attachs)" v-bind="validateInfos.attachs" id="PurchaseOrderFormModal-attachs" name="attachs">
  285. <JUpload v-model:value="formData.attachs" />
  286. </a-form-item>
  287. </a-col>
  288. </a-row>
  289. </a-form>
  290. </template>
  291. </JFormContainer>
  292. <!-- 子表单区域 -->
  293. <a-tabs v-model:activeKey="activeKey" animated style="padding: 24px; padding-top: 0px">
  294. <a-tab-pane tab="采购订单 - 产品明细(product details)" key="purOrderFormShipFormProduct" :forceRender="true">
  295. <a-button
  296. type="primary"
  297. style="margin-right: 1%; margin-bottom: 1%"
  298. @click="selectSaleOrderList"
  299. :disabled="disabled || formData.sourceCode !== ''"
  300. >
  301. 选择销售订单(select saleorder)</a-button
  302. >
  303. <a-button type="primary" style="margin-right: 1%; margin-bottom: 1%" @click="selectVirtualProducts" :disabled="disabled">
  304. 选择虚拟产品(select virtual products)</a-button
  305. >
  306. <!-- <a-button
  307. type="primary"
  308. style="margin-right: 1%; margin-bottom: 1%"
  309. @click="SelectSupplierQuotationList"
  310. v-auth="'purCode:pur_order:selection'"
  311. :disabled="disabled || formData.sourceCode2 !== ''"
  312. >选择供应商报价选定(select supplier quotation selection)</a-button
  313. >
  314. <a-button @click="showModal" v-auth="'purCode:pur_order:changeQuotation'"
  315. type="primary" danger
  316. style="margin-right: 1%; margin-bottom: 1%"
  317. >变更报价(Change quotation)</a-button
  318. > -->
  319. <j-vxe-table
  320. :keep-source="true"
  321. resizable
  322. ref="purOrderFormShipFormProductTableRef"
  323. :loading="purOrderFormShipFormProductTable.loading"
  324. :columns="purOrderFormShipFormProductTable.columns"
  325. :dataSource="purOrderFormShipFormProductTable.dataSource"
  326. :disabled="disabled"
  327. :rowNumber="true"
  328. :rowSelection="true"
  329. asyncRemove
  330. @value-change="changeValues"
  331. >
  332. <template #action="props">
  333. <a-popconfirm title="确定删除吗?" @confirm="handleDelete(props)" v-if="!(formData.id !== '' && formData.submit == '1') && !disabled">
  334. <a>删除(delete)</a>
  335. </a-popconfirm>
  336. </template>
  337. </j-vxe-table>
  338. </a-tab-pane>
  339. <a-tab-pane tab="采购订单 - 船明细(ship details)" key="PurOrderFormShipFormShip" :forceRender="true">
  340. <j-vxe-table
  341. :keep-source="true"
  342. resizable
  343. ref="PurOrderFormShipFormShipTableRef"
  344. :loading="PurOrderFormShipFormShipTable.loading"
  345. :columns="PurOrderFormShipFormShipTable.columns"
  346. :dataSource="PurOrderFormShipFormShipTable.dataSource"
  347. :disabled="disabled"
  348. :rowNumber="true"
  349. :rowSelection="true"
  350. >
  351. <template #action="props">
  352. <a @click="viewAccessory(props)">查看配件信息(view accessory information)</a>
  353. </template>
  354. </j-vxe-table>
  355. </a-tab-pane>
  356. </a-tabs>
  357. <SelectPrpductModal ref="SelectPrpductModalRef" @select-product="addProduct" />
  358. <SelectProjectModal ref="SelectProjectModalRef" @select-project="addProject" />
  359. <BaseShipArchiveAccessoriesModal ref="BaseShipArchiveAccessoriesModalRef" />
  360. <SelectSaleOrderModal ref="SelectSaleOrderModalRef" @select-sale-order="addFormSaleOrder" />
  361. <SelectSupplierQuotation ref="SelectSupplierQuotationRef" @select-supplier-quatation-confirm="addFromQuotation" />
  362. </a-spin>
  363. <a-modal v-model:visible="modalVisible" title="请输入报价选定单号(注:该操作无法撤回)" @ok="chooseQuote" :confirm-loading="confirmLoading"
  364. :mask-closable="false"
  365. :keyboard="false">
  366. <a-input v-model:value="inputValue" placeholder="请输入报价选定单号"/>
  367. </a-modal>
  368. </template>
  369. <script lang="ts">
  370. import { defineComponent, ref, reactive, computed, toRaw, watch } from 'vue';
  371. import { defHttp } from '/@/utils/http/axios';
  372. import { useValidateAntFormAndTable } from '/@/hooks/system/useJvxeMethods';
  373. import {
  374. queryPurOrderFormShipFormShippTable,
  375. queryPurOrderFormProductListByMainId,
  376. ClassList,
  377. queryDataById,
  378. supplierOption,
  379. saveOrUpdate,
  380. queryVersonHistoryById,
  381. queryPurVersonFormShipListByMainId,
  382. queryPurVersonProductListByMainId,
  383. getExchangeRate
  384. } from '../PurchaseOrderyForm.api';
  385. import { JVxeTable } from '/@/components/jeecg/JVxeTable';
  386. import { purchaseOrderShipColumns, purchaseOrderProductColumns } from '../PurchaseOrderForm.data';
  387. import SelectPrpductModal from '../../../publicComponents/SelectPrpductModal.vue';
  388. import SelectProjectModal from '../../../publicComponents/SelectProjectModal.vue';
  389. import SelectSaleOrderModal from '../../../publicComponents/SelectSaleOrderModal.vue';
  390. import BaseShipArchiveAccessoriesModal from '../../../publicComponents/BaseShipArchiveAccessoriesModal.vue';
  391. import SelectSupplierQuotation from '../../../publicComponents/SelectSupplierQuotation.vue';
  392. import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';
  393. import JUpload from '/@/components/Form/src/jeecg/components/JUpload/JUpload.vue';
  394. import { JDictSelectTag, ApiSelect } from '/@/components/Form';
  395. import JSelectInput from '/@/components/Form/src/jeecg/components/JSelectInput.vue';
  396. import JSelectMultiple from '/@/components/Form/src/jeecg/components/JSelectMultiple.vue';
  397. import { Form, message } from 'ant-design-vue';
  398. import { useUserStore } from '/@/store/modules/user';
  399. import { usePermission } from '/@/hooks/web/usePermission';
  400. import moment from 'moment';
  401. const useForm = Form.useForm;
  402. export default defineComponent({
  403. name: 'PurchaseOrderFormModal',
  404. components: {
  405. JVxeTable,
  406. JFormContainer,
  407. SelectPrpductModal,
  408. JUpload,
  409. JDictSelectTag,
  410. JSelectInput,
  411. SelectProjectModal,
  412. BaseShipArchiveAccessoriesModal,
  413. SelectSaleOrderModal,
  414. ApiSelect,
  415. JSelectMultiple,
  416. SelectSupplierQuotation,
  417. },
  418. props: {
  419. formDisabled: {
  420. type: Boolean,
  421. default: false,
  422. },
  423. formData: { type: Object, default: () => {} },
  424. formBpm: { type: Boolean, default: true },
  425. },
  426. emits: ['success'],
  427. setup(props, { emit }) {
  428. const { hasPermission } = usePermission();
  429. const userStore = useUserStore();
  430. const loading = ref(false);
  431. const formRef = ref();
  432. const PurOrderFormShipFormShipTableRef = ref();
  433. const SelectPrpductModalRef = ref();
  434. const SelectProjectModalRef = ref();
  435. const SelectSupplierQuotationRef = ref();
  436. const BaseShipArchiveAccessoriesModalRef = ref();
  437. const SelectSaleOrderModalRef = ref();
  438. const modalVisible = ref(false);
  439. const confirmLoading = ref(false);
  440. const inputValue = ref('');
  441. const showModal = () => {
  442. modalVisible.value = true;
  443. };
  444. const chooseQuote = () => {
  445. if(inputValue.value == '' || inputValue.value == null){
  446. message.error('请输入新的报价选定单号');
  447. return false;
  448. }
  449. confirmLoading.value = true; // 启用加载状态
  450. try {
  451. let params = { id: formData.id,code: inputValue.value,project:formData.project };
  452. let url = '/purCode/purQuotationSelection/purQuotationSelectionProductBy';
  453. defHttp.get({ url: url, params }, { isTransformResponse: false }).then((res) => {
  454. console.log(res.success)
  455. if (res.success) {
  456. const row = res.result;
  457. resetFields();
  458. const tmpData = {};
  459. Object.keys(formData).forEach((key) => {
  460. if (row.hasOwnProperty(key)) {
  461. tmpData[key] = row[key];
  462. }
  463. });
  464. //赋值
  465. Object.assign(formData, tmpData);
  466. purOrderFormShipFormProductTable.dataSource = res.result.purOrderProductList;
  467. }else{
  468. message.error(res.message);
  469. }
  470. });
  471. } finally {
  472. inputValue.value = '';
  473. confirmLoading.value = false; // 无论成功失败都关闭加载
  474. modalVisible.value = false;
  475. }
  476. };
  477. const PurOrderFormShipFormShipTable = reactive<Record<string, any>>({
  478. loading: false,
  479. columns: purchaseOrderShipColumns,
  480. dataSource: [],
  481. });
  482. const purOrderFormShipFormProductTableRef = ref();
  483. const purOrderFormShipFormProductTable = reactive<Record<string, any>>({
  484. loading: false,
  485. columns: purchaseOrderProductColumns,
  486. dataSource: [],
  487. });
  488. const activeKey = ref('purOrderFormShipFormProduct');
  489. var notAllowEdit = ref(false);
  490. const formData = reactive<Record<string, any>>({
  491. id: '',
  492. status: undefined,
  493. delFlag: undefined,
  494. sourceCode: '',
  495. sourceCode2: '',
  496. changeSourceCode: '',
  497. submit: undefined,
  498. organize: '',
  499. billCode: '',
  500. billDate: moment(new Date()).format('YYYY-MM-DD'),
  501. project: '',
  502. projectName: '',
  503. supplier: '',
  504. supplierName: '',
  505. priority: '',
  506. productionClass: '',
  507. model: '',
  508. maker: '',
  509. tradeTerms: '',
  510. isExport: '',
  511. packagebRequirement: '',
  512. recipient: '',
  513. recipientTel: '',
  514. recipientAddress: '',
  515. paymentTerms: '',
  516. delivery: '',
  517. transport: '',
  518. warrantyPeriod: '',
  519. warrantyTerms: '',
  520. exchangeRate: '',
  521. purchaseDepartment: '',
  522. purchaseDepartmentName: '',
  523. purchaseman: '',
  524. purchasemanName: '',
  525. currency: '',
  526. notes: '',
  527. agreementTerms: '',
  528. discountHead: 0,
  529. discountAmount: '',
  530. totalAmount: '',
  531. attachs: '',
  532. });
  533. //表单验证
  534. const validatorRules = reactive({
  535. projectName: [{ required: true, message: '请选择报价项目(select project)' }],
  536. currency: [{ required: true, message: '请选择币种(select currency)' }],
  537. exchangeRate: [{ required: true, message: '请维护本月税率' }],
  538. organize: [{ required: true, message: '请选择组织(select organize)' }],
  539. // currency:[
  540. // { required: true, message: '请选择币种(currency)' }
  541. // ],
  542. });
  543. const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: false });
  544. const dbData = {};
  545. const formItemLayout = {
  546. labelCol: { xs: { span: 24 }, sm: { span: 7 } },
  547. wrapperCol: { xs: { span: 24 }, sm: { span: 15 } },
  548. labelCol1: { xs: { span: 24 }, sm: { span: 7 } },
  549. wrapperCol1: { xs: { span: 24 }, sm: { span: 15 } },
  550. };
  551. // 表单禁用
  552. const disabled = computed(() => {
  553. if (props.formBpm === true) {
  554. if (props.formData.disabled === false) {
  555. return false;
  556. } else {
  557. return true;
  558. }
  559. }
  560. return props.formDisabled;
  561. });
  562. function add() {
  563. resetFields();
  564. PurOrderFormShipFormShipTable.dataSource = [];
  565. purOrderFormShipFormProductTable.dataSource = [];
  566. activeKey.value = 'purOrderFormShipFormProduct';
  567. formData.purchaseman = userStore.getUserInfo.username;
  568. formData.purchasemanName = userStore.getUserInfo.realname;
  569. formData.purchaseDepartment = userStore.getUserInfo.orgCode;
  570. formData.purchaseDepartmentName = userStore.getUserInfo.orgName;
  571. formData.discountHead = 0;
  572. }
  573. async function copy(data, id) {
  574. //主表数据
  575. await queryMainData(id);
  576. formData.id = '';
  577. formData.billCode = '';
  578. formData.submit = undefined;
  579. formData.sourceCode = '';
  580. formData.sourceCode2 = '';
  581. formData.changeSourceCode = '';
  582. formData.project = '';
  583. formData.projectName = '';
  584. //子表数据
  585. const PurOrderFormShipFormShipDataList = await queryPurOrderFormShipFormShippTable(id);
  586. PurOrderFormShipFormShipTable.dataSource = [...PurOrderFormShipFormShipDataList];
  587. data.map((item) => {
  588. item.sourceId = '';
  589. item.sourceType = '';
  590. });
  591. purOrderFormShipFormProductTable.dataSource = [...data];
  592. notAllowEdit.value = false;
  593. }
  594. // 判断有没有参照的子表
  595. // function isSelect() {
  596. // var arrQuo = [],
  597. // arrCon = [];
  598. // purOrderFormShipFormProductTable.dataSource.map((item) => {
  599. // var sign = '';
  600. // sign = item.sourceId ? item.sourceId.substring(0, 3) : '';
  601. // if (item.sourceId && sign == 'Quo') {
  602. // arrQuo.push(item.sourceId);
  603. // } else if (item.sourceId && sign == 'Sale') {
  604. // arrCon.push(item.sourceId);
  605. // }
  606. // });
  607. // if (arrQuo.length == 0 && arrCon.length == 0) {
  608. // formData.sourceCode2 = '';
  609. // formData.sourceCode = '';
  610. // notAllowEdit.value = false;
  611. // } else if (arrQuo.length == 0) {
  612. // formData.sourceCode = '';
  613. // notAllowEdit.value = true;
  614. // } else if (arrCon.length == 0) {
  615. // formData.sourceCode2 = '';
  616. // notAllowEdit.value = true;
  617. // }
  618. // }
  619. async function edit(row) {
  620. //主表数据
  621. await queryMainData(row.id);
  622. //子表数据
  623. const PurOrderFormShipFormShipDataList = await queryPurOrderFormShipFormShippTable(row['id']);
  624. PurOrderFormShipFormShipTable.dataSource = [...PurOrderFormShipFormShipDataList];
  625. const purOrderFormShipFormProductDataList = await queryPurOrderFormProductListByMainId(row['id']);
  626. purOrderFormShipFormProductTable.dataSource = [...purOrderFormShipFormProductDataList];
  627. notAllowEdit.value = true;
  628. }
  629. async function queryMainData(id) {
  630. const row = await queryDataById(id);
  631. resetFields();
  632. const tmpData = {};
  633. Object.keys(formData).forEach((key) => {
  634. if (row.hasOwnProperty(key)) {
  635. tmpData[key] = row[key];
  636. }
  637. });
  638. //赋值
  639. Object.assign(formData, tmpData);
  640. }
  641. //查看版本详情
  642. async function VersionDetail(record) {
  643. //主表数据
  644. await queryVersonHistoryData(record.id);
  645. //子表数据
  646. const PurchaseOrderFormModalShipFormShipDataList = await queryPurVersonFormShipListByMainId(record.id);
  647. PurOrderFormShipFormShipTable.dataSource = [...PurchaseOrderFormModalShipFormShipDataList];
  648. const purOrderFormShipFormProductDataList = await queryPurVersonProductListByMainId(record.id);
  649. purOrderFormShipFormProductTable.dataSource = [...purOrderFormShipFormProductDataList];
  650. }
  651. async function queryVersonHistoryData(id) {
  652. const row = await queryVersonHistoryById(id);
  653. resetFields();
  654. const tmpData = {};
  655. Object.keys(formData).forEach((key) => {
  656. if (row.hasOwnProperty(key)) {
  657. tmpData[key] = row[key];
  658. }
  659. });
  660. //赋值
  661. Object.assign(formData, tmpData);
  662. }
  663. const { getSubFormAndTableData, transformData } = useValidateAntFormAndTable(activeKey, {
  664. purOrderShip: PurOrderFormShipFormShipTableRef,
  665. purOrderProduct: purOrderFormShipFormProductTableRef,
  666. });
  667. async function getFormData() {
  668. try {
  669. // 触发表单验证
  670. await validate();
  671. } catch ({ errorFields }) {
  672. if (errorFields) {
  673. const firstField = errorFields[0];
  674. if (firstField) {
  675. formRef.value.scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });
  676. }
  677. }
  678. return Promise.reject(errorFields);
  679. }
  680. return transformData(toRaw(formData));
  681. }
  682. async function submitForm() {
  683. var xTable = purOrderFormShipFormProductTableRef.value!.getXTable();
  684. if (xTable.data.length == 0) {
  685. message.warning('请添加产品明细');
  686. } else {
  687. purOrderFormShipFormProductTableRef.value!.validateTable().then(async (errMap) => {
  688. if (errMap) {
  689. console.log('表单验证未通过:', { errMap });
  690. } else {
  691. const mainData = await getFormData();
  692. const subData = await getSubFormAndTableData();
  693. const values = Object.assign({}, dbData, mainData, subData);
  694. console.log('表单提交数据', values);
  695. const isUpdate = values.id ? true : false;
  696. const isRevise = values.submit == '1' ? true : false;
  697. await saveOrUpdate(values, isUpdate, isRevise);
  698. //关闭弹窗
  699. emit('success');
  700. }
  701. });
  702. }
  703. }
  704. function setFieldsValue(values) {
  705. if (values) {
  706. Object.keys(values).map((k) => {
  707. formData[k] = values[k];
  708. });
  709. }
  710. }
  711. function onSearchProject() {
  712. SelectProjectModalRef.value.getTable();
  713. }
  714. function addProduct(data) {
  715. data.map((item) => {
  716. item.productClass = item.classId_dictText;
  717. item.productCode = item.code;
  718. item.productId = item.id;
  719. item.id = undefined;
  720. item.notes = '';
  721. });
  722. var xTable = purOrderFormShipFormProductTableRef.value!.getXTable();
  723. var arrProduct = xTable.data.concat(data);
  724. purOrderFormShipFormProductTable.dataSource = arrProduct;
  725. }
  726. function getShipList(id, status) {
  727. let params = { id: id };
  728. let url =
  729. status == 'quotation'
  730. ? '/purCode/purQuotationSelection/queryPurQuotationSelectionShipByMainId'
  731. : '/saleCode/saleOrder/querySaleOrderShipByMainId';
  732. defHttp.get({ url: url, params }, { isTransformResponse: false }).then((res) => {
  733. if (res) {
  734. PurOrderFormShipFormShipTable.dataSource = res.result;
  735. }
  736. });
  737. }
  738. function addFormSaleOrder(data) {
  739. data.map((item) => {
  740. item.model = item.childModel;
  741. item.sourceId = item.childId;
  742. item.sourceType = 'Sale' + item.childId;
  743. item.sourceCode = item.billCode;
  744. item.taxPrice = item.taxPriceGys;
  745. item.taxAmount = (item.taxPrice * item.quantity).toFixed(2);
  746. formData.notes = data[0].notes;
  747. item.notes = '';
  748. // item.productClass =data[0].productClass
  749. });
  750. var xTable = purOrderFormShipFormProductTableRef.value!.getXTable();
  751. var arrProduct = xTable.data.concat(data);
  752. purOrderFormShipFormProductTable.dataSource = arrProduct;
  753. notAllowEdit.value = true;
  754. if (formData.sourceCode2.includes(data[0].billCode)) {
  755. formData.sourceCode2 = formData.sourceCode2;
  756. } else {
  757. formData.sourceCode2 = formData.sourceCode2 == '' ? data[0].billCode : formData.sourceCode2 + ',' + data[0].billCode;
  758. }
  759. formData.afterId = data[0].afterId;
  760. if (formData.sourceCode == '') {
  761. formData.project = data[0].project;
  762. formData.projectName = data[0].projectName;
  763. formData.supplierName = data[0].supplierName;
  764. formData.supplier = data[0].supplierId;
  765. formData.priority = data[0].priority;
  766. formData.productionClass = data[0].productionClass;
  767. formData.model = data[0].headModel;
  768. formData.maker = data[0].maker;
  769. formData.packagebRequirement = data[0].packagebRequirement;
  770. formData.delivery = data[0].delivery;
  771. formData.paymentTerms = data[0].paymentTerms;
  772. formData.warrantyPeriod = data[0].warrantyPeriod;
  773. formData.warrantyTerms = data[0].warrantyTerms;
  774. formData.isExport = data[0].isExport;
  775. formData.exchangeRate = data[0].exchangeRateGys;
  776. formData.currency = data[0].currencyGys;
  777. formData.tradeTerms = data[0].deliveryTerms;
  778. formData.attachs = data[0].attachs;
  779. getShipList(data[0].headId, 'contract');
  780. }
  781. }
  782. function addFromQuotation(data) {
  783. let supplierName = '';
  784. let supplierState = true;
  785. data.map((item) => {
  786. if(supplierName !='' && supplierName != item.selectionSupplier){
  787. supplierState = false;
  788. }
  789. supplierName = item.selectionSupplier;
  790. item.fatherModel = item.model;
  791. item.model = item.childModel;
  792. item.sourceId = item.childId;
  793. item.sourceType = 'Quo' + item.childId;
  794. item.sourceCode = item.billCode;
  795. });
  796. if(supplierState == false){
  797. message.error('报价单非单一供应商,无法选中');
  798. return false;
  799. }
  800. var arrProduct = data.concat(purOrderFormShipFormProductTable.dataSource);
  801. purOrderFormShipFormProductTable.dataSource = arrProduct;
  802. notAllowEdit.value = true;
  803. formData.sourceCode = data[0].billCode;
  804. formData.paymentTerms = data[0].paymentTerm;
  805. if (formData.sourceCode2 == '') {
  806. formData.project = data[0].inquiryProject;
  807. formData.projectName = data[0].projectName;
  808. formData.supplier = data[0].selectionSupplier;
  809. formData.supplierName = data[0].selectionSupplier_dictText;
  810. formData.priority = data[0].priority;
  811. formData.productionClass = data[0].productionClass;
  812. formData.model = data[0].fatherModel;
  813. formData.maker = data[0].maker;
  814. formData.exchangeRate = data[0].exchangeRateUsd;
  815. formData.currency = data[0].currency;
  816. getShipList(data[0].headId, 'quotation');
  817. }
  818. }
  819. //选择供应商报价单选定
  820. function SelectSupplierQuotationList() {
  821. SelectSupplierQuotationRef.value.getTable(formData, 'purOrder');
  822. }
  823. function addProject(data) {
  824. if (data.lenght == 0) {
  825. formData.projectName = '';
  826. formData.projectName = '';
  827. } else {
  828. formData.project = data[0].id;
  829. formData.projectName = data[0].code;
  830. }
  831. }
  832. //查看配件信息
  833. function viewAccessory(prop) {
  834. BaseShipArchiveAccessoriesModalRef.value.getTable(prop.row);
  835. }
  836. //产品明细-删除行
  837. function handleDelete(prop) {
  838. var xTable = purOrderFormShipFormProductTableRef.value!.getXTable();
  839. var newArray = [...xTable.data];
  840. newArray.splice(prop.rowIndex, 1);
  841. purOrderFormShipFormProductTable.dataSource = newArray;
  842. if (purOrderFormShipFormProductTable.dataSource.length !== 0) {
  843. var arrQuo = [],
  844. arrCon = [];
  845. purOrderFormShipFormProductTable.dataSource.map((item) => {
  846. var sign = '';
  847. sign = item.sourceType ? item.sourceType.substring(0, 3) : '';
  848. if (item.sourceType && sign == 'Quo') {
  849. arrQuo.push(item.sourceType);
  850. } else if (item.sourceType && sign == 'Sale') {
  851. arrCon.push(item.sourceType);
  852. }
  853. });
  854. if (arrQuo.length == 0 && arrCon.length == 0) {
  855. formData.sourceCode2 = '';
  856. formData.sourceCode = '';
  857. notAllowEdit.value = false;
  858. } else if (arrQuo.length == 0) {
  859. formData.sourceCode = '';
  860. } else if (arrCon.length == 0) {
  861. formData.sourceCode2 = '';
  862. }
  863. } else {
  864. notAllowEdit.value = false;
  865. formData.sourceCode2 = '';
  866. formData.sourceCode = '';
  867. }
  868. }
  869. // 选择销售订单
  870. function selectSaleOrderList() {
  871. SelectSaleOrderModalRef.value.getTable(formData, 'purOrderAfter');
  872. }
  873. function selectVirtualProducts() {
  874. SelectPrpductModalRef.value.getTableVirtual();
  875. }
  876. function changeValues(prop) {
  877. if (prop.col.key == 'quantity') {
  878. if (prop.row.quantity == 0 || prop.row.quantity) {
  879. var num = prop.row.quantity * Number(prop.row.taxPrice);
  880. prop.row.taxAmount = isNaN(num) ? '' : num.toFixed(2);
  881. purOrderFormShipFormProductTable.dataSource[prop.rowIndex].taxAmount = Number(prop.row.taxAmount);
  882. }
  883. }
  884. if (prop.col.key == 'taxPrice') {
  885. if (prop.row.taxPrice || prop.row.taxPrice == 0) {
  886. var num = prop.row.quantity * Number(prop.row.taxPrice);
  887. prop.row.taxAmount = isNaN(num) ? '' : num.toFixed(2);
  888. var nowTaxPriceOriginal = prop.row.taxPrice / (1 - Number(prop.row.discount) / 100);
  889. prop.row.taxPriceOriginal = isNaN(nowTaxPriceOriginal) ? '' : nowTaxPriceOriginal.toFixed(2);
  890. purOrderFormShipFormProductTable.dataSource[prop.rowIndex].taxAmount = Number(prop.row.taxAmount);
  891. }
  892. }
  893. if (prop.col.key == 'taxPriceOriginal') {
  894. if (prop.row.taxPriceOriginal || prop.row.taxPriceOriginal == 0) {
  895. let price = 0;
  896. if (prop.row.discount) {
  897. price = Number(prop.row.taxPriceOriginal) * (1 - Number(prop.row.discount) / 100);
  898. } else {
  899. price = Number(prop.row.taxPriceOriginal);
  900. }
  901. prop.row.taxPrice = isNaN(price) ? '' : Number(price.toFixed(2));
  902. let num = prop.row.quantity * Number(prop.row.taxPrice);
  903. prop.row.taxAmount = isNaN(num) ? '' : num.toFixed(2);
  904. purOrderFormShipFormProductTable.dataSource[prop.rowIndex].taxAmount = Number(prop.row.taxAmount);
  905. }
  906. }
  907. }
  908. /**
  909. * 值改变事件触发-树控件回调
  910. * @param key
  911. * @param value
  912. */
  913. function handleFormChange(key, value) {
  914. formData[key] = value;
  915. }
  916. // 折扣改变
  917. const discountHeadChange = (event) => {
  918. if (formData.totalAmount) {
  919. getDiscountAmount();
  920. formData.discountAmount = (parseFloat(formData.discountAmount) + parseFloat(formData.virtualAmount)).toFixed(2);
  921. }
  922. };
  923. // 计算折扣金额
  924. const getDiscountAmount = () => {
  925. formData.discountAmount = (Number(formData.totalAmount) * (1 - Number(formData.discountHead) / 100)).toFixed(2);
  926. };
  927. // 监听 count 的变化
  928. watch(
  929. purOrderFormShipFormProductTable,
  930. (newValue, oldValue) => {
  931. let data = newValue.dataSource;
  932. let total = 0;
  933. let other = 0;
  934. data.map((item) => {
  935. if (item.sourceType) {
  936. total += Number(item.taxAmount) || 0;
  937. } else {
  938. other += Number(item.taxAmount) || 0;
  939. }
  940. });
  941. formData.totalAmount = total;
  942. formData.virtualAmount = other;
  943. getDiscountAmount();
  944. formData.discountAmount = (parseFloat(formData.discountAmount) + parseFloat(formData.virtualAmount)).toFixed(2);
  945. if (data.length < 1) {
  946. formData.discountHead = 0;
  947. formData.discountAmount = '';
  948. }
  949. },
  950. { deep: true }
  951. );
  952. // 监听币种变化,获取汇率
  953. watch(() => formData.currency,
  954. async (newVal, oldVal) => {
  955. if (newVal && newVal !== oldVal && oldVal!=null && oldVal!='') {
  956. // setExchangeRate();
  957. await handleChangeCurrency(newVal, oldVal);
  958. }
  959. },
  960. { immediate: true }
  961. );
  962. // 监听日期变化,获取汇率
  963. watch(() => formData.billDate,
  964. async (newDate, oldDate) => {
  965. const currentCurrency = formData.currency;
  966. if (currentCurrency && newDate !== oldDate) {
  967. // 保留当前币种不变,但重新获取汇率并刷新子表
  968. await handleChangeCurrency(currentCurrency, currentCurrency);
  969. }
  970. },
  971. { immediate: false }
  972. );
  973. async function handleChangeCurrency (newCurrency?: string, oldCurrency?: string) {
  974. if (!newCurrency || !oldCurrency){
  975. formData.exchangeRate = '';
  976. return
  977. }
  978. const date = moment(formData.billDate);
  979. const year = date.format('YYYY');
  980. const month = date.format('MM');
  981. try {
  982. // 获取旧币种汇率(原币种)与 新币种汇率(新币种),并展示新币种汇率
  983. const oldRateRes = await getExchangeRate({ year, month, currency: oldCurrency });
  984. const oldExchangeRate = parseFloat(oldRateRes || '0');
  985. if(oldExchangeRate == 0){
  986. formData.exchangeRate = '';
  987. return
  988. }
  989. const newRateRes = await getExchangeRate({ year, month, currency: newCurrency });
  990. const newExchangeRate = parseFloat(newRateRes || '0');
  991. if(newExchangeRate == 0){
  992. formData.exchangeRate = '';
  993. return
  994. }
  995. formData.exchangeRate = isNaN(newExchangeRate) ? '' : newExchangeRate;
  996. purOrderFormShipFormProductTable.dataSource = purOrderFormShipFormProductTable.dataSource.map(item => {
  997. const originalTaxPriceOriginal = item.taxPriceOriginal;
  998. if (!originalTaxPriceOriginal) return item;
  999. // 换算逻辑:原币种金额 × 原汇率 ÷ 新汇率
  1000. const convertedTaxPriceOriginal = originalTaxPriceOriginal * oldExchangeRate / newExchangeRate;
  1001. return {
  1002. ...item,
  1003. taxPriceOriginal: convertedTaxPriceOriginal.toFixed(4).replace(/\.?0+$/, '') || '',
  1004. _needUpdate: true // 标记需要更新的行
  1005. };
  1006. });
  1007. // 手动触发 changeValues 计算其他字段
  1008. const updatedDataSource = purOrderFormShipFormProductTable.dataSource;
  1009. updatedDataSource.forEach((row,index) => {
  1010. if (row._needUpdate) {
  1011. changeValues({
  1012. col: { key: 'taxPriceOriginal' },
  1013. row: row,
  1014. rowIndex: index
  1015. });
  1016. }
  1017. });
  1018. } catch (err) {
  1019. console.error('汇率换算失败:', err);
  1020. // formData.exchangeRate = '';
  1021. }
  1022. }
  1023. return {
  1024. hasPermission,
  1025. discountHeadChange,
  1026. PurOrderFormShipFormShipTableRef,
  1027. PurOrderFormShipFormShipTable,
  1028. purOrderFormShipFormProductTableRef,
  1029. purOrderFormShipFormProductTable,
  1030. SelectSaleOrderModalRef,
  1031. SelectSupplierQuotationRef,
  1032. validatorRules,
  1033. validateInfos,
  1034. activeKey,
  1035. loading,
  1036. formData,
  1037. setFieldsValue,
  1038. handleFormChange,
  1039. formItemLayout,
  1040. disabled,
  1041. getFormData,
  1042. submitForm,
  1043. add,
  1044. edit,
  1045. copy,
  1046. formRef,
  1047. SelectPrpductModalRef,
  1048. addProduct,
  1049. onSearchProject,
  1050. SelectProjectModalRef,
  1051. addProject,
  1052. handleDelete,
  1053. BaseShipArchiveAccessoriesModalRef,
  1054. viewAccessory,
  1055. VersionDetail,
  1056. notAllowEdit,
  1057. selectSaleOrderList,
  1058. addFormSaleOrder,
  1059. ClassList,
  1060. supplierOption,
  1061. selectVirtualProducts,
  1062. changeValues,
  1063. SelectSupplierQuotationList,
  1064. addFromQuotation,
  1065. handleChangeCurrency,
  1066. showModal,
  1067. modalVisible,
  1068. inputValue,
  1069. chooseQuote,
  1070. confirmLoading,
  1071. };
  1072. },
  1073. });
  1074. </script>
  1075. <style lang="less" scoped>
  1076. /** 时间和数字输入框样式 */
  1077. :deep(.ant-input-number) {
  1078. width: 100%;
  1079. }
  1080. :deep(.ant-calendar-picker) {
  1081. width: 100%;
  1082. }
  1083. // /deep/.vxe-table--body-wrapper{
  1084. // height: 100% !important;
  1085. // }
  1086. /deep/.ant-modal-body {
  1087. padding: 24px !important;
  1088. }
  1089. /deep/.ant-form-item {
  1090. margin-bottom: 8px !important;
  1091. }
  1092. /deep/.vxe-cell--valid-error-msg {
  1093. color: white !important;
  1094. background-color: white !important;
  1095. }
  1096. </style>