purInAbnormalForm.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  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">
  9. <a-input v-model:value="formData.billCode" placeholder="入库单号(bill code)" disabled />
  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
  15. placeholder="请选择入库日期(bill date)"
  16. v-model:value="formData.billDate"
  17. value-format="YYYY-MM-DD"
  18. style="width: 100%"
  19. allow-clear
  20. />
  21. </a-form-item>
  22. </a-col>
  23. <a-col :span="12">
  24. <a-form-item label="项目(project)" v-bind="validateInfos.projectName" id="SaleOrderForm-projectName" name="projectName">
  25. <a-input v-model:value="formData.projectName" placeholder="请输入项目(project)" disabled allow-clear />
  26. </a-form-item>
  27. </a-col>
  28. <a-col :span="12">
  29. <a-form-item label="供应商(supplier)" v-bind="validateInfos.supplierName" id="SaleOrderForm-supplierName" name="supplierName">
  30. <a-input v-model:value="formData.supplierName" placeholder="请输入" disabled allow-clear />
  31. </a-form-item>
  32. </a-col>
  33. <a-col :span="12">
  34. <a-form-item label="发货方式(delivery)" v-bind="validateInfos.delivery" id="SaleOrderForm-delivery" name="delivery">
  35. <JDictSelectTag v-model:value="formData.delivery" placeholder="请选择" dictCode="delivery_methods" disabled />
  36. </a-form-item>
  37. </a-col>
  38. <a-col :span="12">
  39. <a-form-item
  40. label="产品分类(production class)"
  41. v-bind="validateInfos.productionClass"
  42. id="SaleOrderForm-productionClass"
  43. name="productionClass"
  44. >
  45. <ApiSelect
  46. :api="ClassList"
  47. showSearch
  48. v-model:value="formData.productionClass"
  49. optionFilterProp="label"
  50. resultField="records"
  51. labelField="name"
  52. valueField="id"
  53. :params="{ pageSize: -1 }"
  54. disabled
  55. />
  56. <!-- <a-input v-model:value="formData.productionClass" placeholder="请输入" allow-clear disabled /> -->
  57. </a-form-item>
  58. </a-col>
  59. <a-col :span="12">
  60. <a-form-item label="机型(model)" v-bind="validateInfos.model" id="SaleOrderForm-model" name="model">
  61. <a-input v-model:value="formData.model" placeholder="请输入" allow-clear disabled />
  62. </a-form-item>
  63. </a-col>
  64. <a-col :span="12">
  65. <a-form-item label="厂家(maker)" v-bind="validateInfos.maker" id="SaleOrderForm-maker" name="maker">
  66. <a-input v-model:value="formData.maker" placeholder="请输入厂家(maker)" allow-clear disabled />
  67. </a-form-item>
  68. </a-col>
  69. <a-col :span="12">
  70. <a-form-item
  71. label="货位(goods allocation)"
  72. v-bind="validateInfos.goodsAllocation"
  73. id="SaleOrderForm-goodsAllocation"
  74. name="goodsAllocation"
  75. >
  76. <JDictSelectTag v-model:value="formData.goodsAllocation" placeholder="请选择" dictCode="goods_allocation" />
  77. </a-form-item>
  78. </a-col>
  79. <a-col :span="12">
  80. <a-form-item label="仓库(warehouse)" v-bind="validateInfos.warehouse" id="SaleOrderForm-warehouse" name="warehouse">
  81. <JDictSelectTag v-model:value="formData.warehouse" placeholder="请选择" dictCode="warehouse" />
  82. </a-form-item>
  83. </a-col>
  84. <a-col :span="12">
  85. <a-form-item label="备注(notes)" v-bind="validateInfos.notes" id="SaleOrderForm-notes" name="notes">
  86. <a-input v-model:value="formData.notes" />
  87. </a-form-item>
  88. </a-col>
  89. <a-col :span="12">
  90. <a-form-item
  91. label="到货详情(arrival details)"
  92. v-bind="validateInfos.arrivalDetails"
  93. id="PuechaseInquiryFormForm-attachs"
  94. name="arrivalDetails"
  95. >
  96. <a :href="baseUrl + formData.arrivalDetails">{{ formData.arrivalDetails }}</a>
  97. </a-form-item>
  98. </a-col>
  99. <a-col :span="12">
  100. <a-form-item label="附件(attachs)" v-bind="validateInfos.attachs" id="PuechaseInquiryFormForm-attachs" name="attachs">
  101. <JUpload v-model:value="formData.attachs" />
  102. </a-form-item>
  103. </a-col>
  104. </a-row>
  105. </a-form>
  106. </template>
  107. </JFormContainer>
  108. <!-- 子表单区域 -->
  109. <a-tabs v-model:activeKey="activeKey" animated style="padding: 24px; padding-top: 0px">
  110. <a-tab-pane tab="入库明细(stock in details)" key="stockIn" :forceRender="true">
  111. <j-vxe-table
  112. :keep-source="true"
  113. resizable
  114. ref="stockInTableRef"
  115. :loading="stockInTable.loading"
  116. :columns="stockInTable.columns"
  117. :dataSource="stockInTable.dataSource"
  118. :disabled="disabled"
  119. :rowNumber="true"
  120. :rowSelection="true"
  121. asyncRemove
  122. :maxHeight="540"
  123. :keyboardEdit="true"
  124. />
  125. </a-tab-pane>
  126. <a-tab-pane tab="船明细(ship details)" key="purInAbnormalShip" :forceRender="true">
  127. <j-vxe-table
  128. :keep-source="true"
  129. resizable
  130. ref="purInAbnormalShipTableRef"
  131. :loading="purInAbnormalShipTable.loading"
  132. :columns="purInAbnormalShipTable.columns"
  133. :dataSource="purInAbnormalShipTable.dataSource"
  134. :disabled="disabled"
  135. :rowNumber="true"
  136. :rowSelection="true"
  137. >
  138. <template #action="props">
  139. <a @click="viewAccessory(props)">查看配件信息(view accessory information)</a>
  140. </template>
  141. </j-vxe-table>
  142. </a-tab-pane>
  143. </a-tabs>
  144. <BaseShipArchiveAccessoriesModal ref="BaseShipArchiveAccessoriesModalRef" />
  145. </a-spin>
  146. </template>
  147. <script lang="ts">
  148. import { defineComponent, ref, reactive, computed, toRaw } from 'vue';
  149. import { defHttp } from '/@/utils/http/axios';
  150. import { useValidateAntFormAndTable } from '/@/hooks/system/useJvxeMethods';
  151. import { queryPurInAbnormalFormShip, querystockInByMainId, ClassList, queryDataById } from '../purInAbnormalForm.api';
  152. import { JVxeTable } from '/@/components/jeecg/JVxeTable';
  153. import { purInAbnormalShipColumns, stockInColumns } from '../purInAbnormalForm.data';
  154. import BaseShipArchiveAccessoriesModal from '../../../publicComponents/BaseShipArchiveAccessoriesModal.vue';
  155. import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';
  156. import JUpload from '/@/components/Form/src/jeecg/components/JUpload/JUpload.vue';
  157. import { JDictSelectTag } from '/@/components/Form';
  158. import { Form, message } from 'ant-design-vue';
  159. import { useGlobSetting } from '/@/hooks/setting';
  160. import { ApiSelect } from '/@/components/Form/index';
  161. import moment from 'moment';
  162. const useForm = Form.useForm;
  163. export default defineComponent({
  164. name: 'PurInAbnormalForm',
  165. components: {
  166. JVxeTable,
  167. JFormContainer,
  168. JUpload,
  169. JDictSelectTag,
  170. BaseShipArchiveAccessoriesModal,
  171. ApiSelect
  172. },
  173. props: {
  174. formDisabled: {
  175. type: Boolean,
  176. default: false,
  177. },
  178. formData: { type: Object, default: () => {} },
  179. formBpm: { type: Boolean, default: true },
  180. },
  181. emits: ['success'],
  182. setup(props, { emit }) {
  183. const { domainUrl } = useGlobSetting();
  184. const baseUrl = domainUrl + '/sys/common/static/';
  185. const loading = ref(false);
  186. const formRef = ref();
  187. const purInAbnormalShipTableRef = ref();
  188. const BaseShipArchiveAccessoriesModalRef = ref();
  189. const purInAbnormalShipTable = reactive<Record<string, any>>({
  190. loading: false,
  191. columns: purInAbnormalShipColumns,
  192. dataSource: [],
  193. });
  194. const stockInTableRef = ref();
  195. const stockInTable = reactive<Record<string, any>>({
  196. loading: false,
  197. columns: stockInColumns,
  198. dataSource: [],
  199. });
  200. const activeKey = ref('stockIn');
  201. const formData = reactive<Record<string, any>>({
  202. id: '',
  203. status: undefined,
  204. delFlag: undefined,
  205. sourceCode: '',
  206. billCode: '',
  207. billDate: moment(new Date()).format('YYYY-MM-DD'),
  208. project: '',
  209. projectName: '',
  210. supplier: '',
  211. supplierName: '',
  212. delivery: '',
  213. productionClass: '',
  214. model: '',
  215. maker: '',
  216. goodsAllocation: '',
  217. warehouse: '',
  218. notes: '',
  219. attachs: '',
  220. arrivalDetails: '',
  221. typr: '1',
  222. });
  223. //表单验证
  224. const validatorRules = reactive({});
  225. const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: false });
  226. const dbData = {};
  227. const formItemLayout = {
  228. labelCol: { xs: { span: 24 }, sm: { span: 5 } },
  229. wrapperCol: { xs: { span: 24 }, sm: { span: 16 } },
  230. labelCol1: { xs: { span: 24 }, sm: { span: 7 } },
  231. wrapperCol1: { xs: { span: 24 }, sm: { span: 15 } },
  232. };
  233. // 表单禁用
  234. const disabled = computed(() => {
  235. if (props.formBpm === true) {
  236. if (props.formData.disabled === false) {
  237. return false;
  238. } else {
  239. return true;
  240. }
  241. }
  242. return props.formDisabled;
  243. });
  244. function add() {
  245. resetFields();
  246. purInAbnormalShipTable.dataSource = [];
  247. stockInTable.dataSource = [];
  248. activeKey.value = 'stockIn';
  249. }
  250. async function edit(row) {
  251. //主表数据
  252. await queryMainData(row.id);
  253. //子表数据
  254. const purInAbnormalShipDataList = await queryPurInAbnormalFormShip(row['id']);
  255. purInAbnormalShipTable.dataSource = [...purInAbnormalShipDataList];
  256. const stockInDataList = await querystockInByMainId(row['id']);
  257. stockInTable.dataSource = [...stockInDataList];
  258. }
  259. async function queryMainData(id) {
  260. const row = await queryDataById(id);
  261. resetFields();
  262. const tmpData = {};
  263. Object.keys(formData).forEach((key) => {
  264. if (row.hasOwnProperty(key)) {
  265. tmpData[key] = row[key];
  266. }
  267. });
  268. //赋值
  269. Object.assign(formData, tmpData);
  270. }
  271. const { getSubFormAndTableData, transformData } = useValidateAntFormAndTable(activeKey, {
  272. storePurchaseInShip: purInAbnormalShipTableRef,
  273. storePurchaseInDetails: stockInTableRef,
  274. });
  275. async function getFormData() {
  276. try {
  277. // 触发表单验证
  278. await validate();
  279. } catch ({ errorFields }) {
  280. if (errorFields) {
  281. const firstField = errorFields[0];
  282. if (firstField) {
  283. formRef.value.scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });
  284. }
  285. }
  286. return Promise.reject(errorFields);
  287. }
  288. return transformData(toRaw(formData));
  289. }
  290. async function submitForm() {
  291. if (formData.sourceCode == '') {
  292. message.error('请添加入库明细!');
  293. } else {
  294. const mainData = await getFormData();
  295. const subData = await getSubFormAndTableData();
  296. const values = Object.assign({}, dbData, mainData, subData);
  297. console.log('表单提交数据', values);
  298. const isUpdate = values.id ? true : false;
  299. await saveOrUpdate(values, isUpdate);
  300. //关闭弹窗
  301. emit('success');
  302. }
  303. }
  304. function setFieldsValue(values) {
  305. if (values) {
  306. Object.keys(values).map((k) => {
  307. formData[k] = values[k];
  308. });
  309. }
  310. }
  311. //查看配件信息
  312. function viewAccessory(prop) {
  313. BaseShipArchiveAccessoriesModalRef.value.getTable(prop.row);
  314. }
  315. /**
  316. * 值改变事件触发-树控件回调
  317. * @param key
  318. * @param value
  319. */
  320. function handleFormChange(key, value) {
  321. formData[key] = value;
  322. }
  323. return {
  324. purInAbnormalShipTableRef,
  325. purInAbnormalShipTable,
  326. stockInTableRef,
  327. stockInTable,
  328. validatorRules,
  329. validateInfos,
  330. activeKey,
  331. loading,
  332. formData,
  333. setFieldsValue,
  334. handleFormChange,
  335. formItemLayout,
  336. disabled,
  337. getFormData,
  338. submitForm,
  339. add,
  340. edit,
  341. formRef,
  342. BaseShipArchiveAccessoriesModalRef,
  343. viewAccessory,
  344. baseUrl,
  345. ClassList,
  346. };
  347. },
  348. });
  349. </script>
  350. <style lang="less" scoped>
  351. /** 时间和数字输入框样式 */
  352. :deep(.ant-input-number) {
  353. width: 100%;
  354. }
  355. :deep(.ant-calendar-picker) {
  356. width: 100%;
  357. }
  358. /deep/.vxe-table--body-wrapper {
  359. height: 100% !important;
  360. }
  361. /deep/.ant-modal-body {
  362. padding: 24px !important;
  363. }
  364. /deep/.ant-form-item {
  365. margin-bottom: 8px !important;
  366. }
  367. </style>