commissionPayRequestForm.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. <template>
  2. <a-spin :spinning="loading">
  3. <JFormContainer :disabled="disabled">
  4. <template #detail>
  5. <a-form v-bind="formItemLayout" name="commissionPayRequest" ref="formRef">
  6. <a-row>
  7. <a-col :span="12">
  8. <a-form-item label="申请单编号(bill code)" v-bind="validateInfos.billCode" id="commissionPayRequest-billCode" name="billCode">
  9. <a-input v-model:value="formData.billCode" placeholder="自动生成" 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="commissionPayRequest-billDate" name="billDate">
  14. <a-date-picker placeholder="请选择" 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
  19. label="返佣类型(commission type)"
  20. v-bind="validateInfos.commissionType"
  21. id="commissionPayRequest-commissionType"
  22. name="commissionType"
  23. >
  24. <JDictSelectTag v-model:value="formData.commissionType" placeholder="请选择" dictCode="commission_type" style="width: 100%" />
  25. </a-form-item>
  26. </a-col>
  27. <a-col :span="12">
  28. <a-form-item label="收款人(payee)" v-bind="validateInfos.payee" id="commissionPayRequest-payee" name="payee">
  29. <ApiSelect
  30. :api="listPayee"
  31. showSearch
  32. v-model:value="formData.payee"
  33. :filterOption="true"
  34. resultField="records"
  35. labelField="name"
  36. valueField="id"
  37. :params="{ pageSize: -1 }"
  38. optionFilterProp="label"
  39. />
  40. </a-form-item>
  41. </a-col>
  42. <a-col :span="12">
  43. <a-form-item
  44. label="预计付款日期(expected payment date)"
  45. v-bind="validateInfos.expectedPaymentDate"
  46. id="commissionPayRequest-expectedPaymentDate"
  47. name="expectedPaymentDate"
  48. >
  49. <a-date-picker
  50. placeholder="请选择预计付款日期(expected payment date"
  51. v-model:value="formData.expectedPaymentDate"
  52. value-format="YYYY-MM-DD"
  53. style="width: 100%"
  54. allow-clear
  55. />
  56. </a-form-item>
  57. </a-col>
  58. <a-col :span="12">
  59. <a-form-item label="币种(currency)" v-bind="validateInfos.currency" id="commissionPayRequest-currency" name="currency">
  60. <JDictSelectTag v-model:value="formData.currency" placeholder="请选择" dictCode="currency" style="width: 100%" />
  61. </a-form-item>
  62. </a-col>
  63. <a-col :span="12">
  64. <a-form-item label="开户行(opening bank)" v-bind="validateInfos.openingBank" id="commissionPayRequest-openingBank" name="openingBank">
  65. <a-input v-model:value="formData.openingBank" placeholder="请输入" allow-clear AutoComplete="off" />
  66. </a-form-item>
  67. </a-col>
  68. <a-col :span="12">
  69. <a-form-item label="银行账号(bank account)" v-bind="validateInfos.bankAccount" id="commissionPayRequest-bankAccount" name="bankAccount">
  70. <a-input v-model:value="formData.bankAccount" placeholder="请输入" allow-clear AutoComplete="off" />
  71. </a-form-item>
  72. </a-col>
  73. <a-col :span="12">
  74. <a-form-item label="银行代码(swift code)" v-bind="validateInfos.swiftCode" id="commissionPayRequest-swiftCode" name="swiftCode">
  75. <a-input v-model:value="formData.swiftCode" placeholder="请输入" allow-clear AutoComplete="off" />
  76. </a-form-item>
  77. </a-col>
  78. <a-col :span="12">
  79. <a-form-item label="备注(notes)" v-bind="validateInfos.notes" id="commissionPayRequest-notes" name="notes">
  80. <a-input v-model:value="formData.notes" placeholder="请输入备注(notes)" allow-clear AutoComplete="off" />
  81. </a-form-item>
  82. </a-col>
  83. </a-row>
  84. </a-form>
  85. </template>
  86. </JFormContainer>
  87. <!-- 子表单区域 -->
  88. <a-tabs v-model:activeKey="activeKey" animated style="padding: 24px; padding-top: 0px">
  89. <a-tab-pane tab="佣金付款申请 - 付款明细(payment details)" key="paymentDetails" :forceRender="true">
  90. <a-button type="primary" style="margin-right: 1%; margin-bottom: 1%" @click="selectOrder" :disabled="disabled">
  91. 选择销售订单(select sale order)</a-button
  92. >
  93. <j-vxe-table
  94. :keep-source="true"
  95. resizable
  96. ref="paymentDetailsTableRef"
  97. :loading="paymentDetailsTable.loading"
  98. :columns="paymentDetailsTable.columns"
  99. :dataSource="paymentDetailsTable.dataSource"
  100. :disabled="disabled"
  101. :rowNumber="true"
  102. :rowSelection="true"
  103. asyncRemove
  104. >
  105. <template #action="props">
  106. <a-popconfirm title="确定删除吗?" @confirm="handleDelete1(props)" v-if="!disabled">
  107. <a>删除(delete)</a>
  108. </a-popconfirm>
  109. </template>
  110. </j-vxe-table>
  111. </a-tab-pane>
  112. </a-tabs>
  113. <SelectSaleOrderModal ref="SelectSaleOrderModalRef" @select-sale-order-mian="addDetailList" />
  114. </a-spin>
  115. </template>
  116. <script lang="ts">
  117. import { defineComponent, ref, reactive, computed, toRaw, onMounted } from 'vue';
  118. import { defHttp } from '/@/utils/http/axios';
  119. import { useValidateAntFormAndTable } from '/@/hooks/system/useJvxeMethods';
  120. import { queryPaymentDetailListByMainId, queryDataById, saveOrUpdate, listPayee } from '../commissionPayRequestForm.api';
  121. import { JVxeTable } from '/@/components/jeecg/JVxeTable';
  122. import { paymentDetailColumns } from '../commissionPayRequestList.data';
  123. import SelectSaleOrderModal from '../../../publicComponents/SelectSaleOrderMianModal.vue';
  124. import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';
  125. import JUpload from '/@/components/Form/src/jeecg/components/JUpload/JUpload.vue';
  126. import { ApiSelect } from '/@/components/Form';
  127. import { JDictSelectTag } from '/@/components/Form';
  128. import { Form, message } from 'ant-design-vue';
  129. import moment from 'moment';
  130. const useForm = Form.useForm;
  131. export default defineComponent({
  132. name: 'CommissionPayRequestForm',
  133. components: {
  134. JVxeTable,
  135. JFormContainer,
  136. JUpload,
  137. JDictSelectTag,
  138. SelectSaleOrderModal,
  139. ApiSelect,
  140. },
  141. props: {
  142. formDisabled: {
  143. type: Boolean,
  144. default: false,
  145. },
  146. formData: { type: Object, default: () => {} },
  147. formBpm: { type: Boolean, default: true },
  148. },
  149. emits: ['success'],
  150. setup(props, { emit }) {
  151. const loading = ref(false);
  152. const formRef = ref();
  153. const SelectSaleOrderModalRef = ref();
  154. const paymentDetailsTableRef = ref();
  155. const paymentDetailsTable = reactive<Record<string, any>>({
  156. loading: false,
  157. columns: paymentDetailColumns,
  158. dataSource: [],
  159. });
  160. const activeKey = ref('paymentDetails');
  161. const formData = reactive<Record<string, any>>({
  162. id: '',
  163. status: undefined,
  164. delFlag: undefined,
  165. sourceCode: '',
  166. billDate: moment(new Date()).format('YYYY-MM-DD'),
  167. billCode: '',
  168. commissionType: '',
  169. payee: '',
  170. expectedPaymentDate: '',
  171. currency: '',
  172. openingBank: '',
  173. bankAccount: '',
  174. swiftCode: '',
  175. notes: '',
  176. });
  177. //表单验证
  178. const validatorRules = reactive({
  179. payee: [{ required: true, message: '请选择付款人(select payee)' }],
  180. currency: [{ required: true, message: '请选择币种(select currency)' }],
  181. });
  182. const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: false });
  183. const dbData = {};
  184. const formItemLayout = {
  185. labelCol: { xs: { span: 24 }, sm: { span: 8 } },
  186. wrapperCol: { xs: { span: 24 }, sm: { span: 13 } },
  187. labelCol1: { xs: { span: 24 }, sm: { span: 8 } },
  188. wrapperCol1: { xs: { span: 24 }, sm: { span: 13 } },
  189. };
  190. // 表单禁用
  191. const disabled = computed(() => {
  192. if (props.formBpm === true) {
  193. if (props.formData.disabled === false) {
  194. return false;
  195. } else {
  196. return true;
  197. }
  198. }
  199. return props.formDisabled;
  200. });
  201. //新增方法
  202. function add() {
  203. resetFields();
  204. paymentDetailsTable.dataSource = [];
  205. activeKey.value = 'paymentDetails';
  206. }
  207. //编辑方法
  208. async function edit(row) {
  209. //主表数据
  210. await queryMainData(row.id);
  211. const paymentDetailsDataList = await queryPaymentDetailListByMainId(row['id']);
  212. paymentDetailsTable.dataSource = [...paymentDetailsDataList];
  213. }
  214. //获取主表
  215. async function queryMainData(id) {
  216. const row = await queryDataById(id);
  217. resetFields();
  218. const tmpData = {};
  219. Object.keys(formData).forEach((key) => {
  220. if (row.hasOwnProperty(key)) {
  221. tmpData[key] = row[key];
  222. }
  223. });
  224. //赋值
  225. Object.assign(formData, tmpData);
  226. }
  227. const { getSubFormAndTableData, transformData } = useValidateAntFormAndTable(activeKey, {
  228. purCommissionRequestDetails: paymentDetailsTableRef,
  229. });
  230. //获取表单信息
  231. async function getFormData() {
  232. try {
  233. // 触发表单验证
  234. await validate();
  235. } catch ({ errorFields }) {
  236. if (errorFields) {
  237. const firstField = errorFields[0];
  238. if (firstField) {
  239. formRef.value.scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });
  240. }
  241. }
  242. return Promise.reject(errorFields);
  243. }
  244. return transformData(toRaw(formData));
  245. }
  246. //保存
  247. async function submitForm() {
  248. var xTable = paymentDetailsTableRef.value!.getXTable();
  249. if (xTable.data.length == 0) {
  250. message.warning('请添加付款明细');
  251. } else {
  252. paymentDetailsTableRef.value!.validateTable().then(async (errMap) => {
  253. if (errMap) {
  254. console.log('表单验证未通过:', { errMap });
  255. } else {
  256. const mainData = await getFormData();
  257. const subData = await getSubFormAndTableData();
  258. const values = Object.assign({}, dbData, mainData, subData);
  259. console.log('表单提交数据', values);
  260. const isUpdate = values.id ? true : false;
  261. await saveOrUpdate(values, isUpdate);
  262. //关闭弹窗
  263. emit('success');
  264. }
  265. });
  266. }
  267. }
  268. function setFieldsValue(values) {
  269. if (values) {
  270. Object.keys(values).map((k) => {
  271. formData[k] = values[k];
  272. });
  273. }
  274. }
  275. /**
  276. * 值改变事件触发-树控件回调
  277. * @param key
  278. * @param value
  279. */
  280. function handleFormChange(key, value) {
  281. formData[key] = value;
  282. }
  283. //产品明细-删除行
  284. async function handleDelete1(prop) {
  285. var xTable = paymentDetailsTableRef.value!.getXTable();
  286. var newArray = [...xTable.data];
  287. newArray.splice(prop.rowIndex, 1);
  288. paymentDetailsTable.dataSource = newArray;
  289. }
  290. function selectOrder() {
  291. SelectSaleOrderModalRef.value.getTableFormCommissionPayment();
  292. }
  293. function addDetailList(data) {
  294. var billCodeArr = [];
  295. data.map((item) => {
  296. item.sourceId = item.id;
  297. item.saleCode = item.billCode;
  298. billCodeArr.push(item.billCode);
  299. item.saleId = item.id;
  300. item.orderMoney = item.orderMoney;
  301. item.id = undefined;
  302. });
  303. if (formData.sourceCode !== '') {
  304. formData.sourceCode = formData.sourceCode + ',' + billCodeArr.join(',');
  305. } else {
  306. formData.sourceCode = billCodeArr.join(',');
  307. }
  308. var xTable = paymentDetailsTableRef.value!.getXTable();
  309. var arrSonFormDelivery = xTable.data.concat(data);
  310. paymentDetailsTable.dataSource = arrSonFormDelivery;
  311. }
  312. return {
  313. paymentDetailsTableRef,
  314. paymentDetailsTable,
  315. validatorRules,
  316. validateInfos,
  317. activeKey,
  318. loading,
  319. formData,
  320. setFieldsValue,
  321. handleFormChange,
  322. formItemLayout,
  323. disabled,
  324. getFormData,
  325. submitForm,
  326. add,
  327. edit,
  328. formRef,
  329. handleDelete1,
  330. SelectSaleOrderModalRef,
  331. selectOrder,
  332. addDetailList,
  333. listPayee,
  334. };
  335. },
  336. });
  337. </script>
  338. <style lang="less" scoped>
  339. /** 时间和数字输入框样式 */
  340. :deep(.ant-input-number) {
  341. width: 100%;
  342. }
  343. :deep(.ant-calendar-picker) {
  344. width: 100%;
  345. }
  346. /deep/.vxe-table--body-wrapper {
  347. height: 100% !important;
  348. }
  349. /deep/.ant-modal-body {
  350. padding: 24px !important;
  351. }
  352. /deep/.ant-form-item {
  353. margin-bottom: 8px !important;
  354. }
  355. /deep/.vxe-cell--valid-error-msg {
  356. color: white !important;
  357. background-color: white !important;
  358. }
  359. </style>