Commit 2bf3d1df48a56ca71093d6112e818b602cf3ec5f
1 parent
cfeaf8a0
审核调试122501
Showing
17 changed files
with
930 additions
and
312 deletions
src/views/project/approve/ProfitFieldPanel.vue
0 → 100644
1 | +<template> | |
2 | + <BasicTable @register="registerTable" className="p-0"> | |
3 | + <template #bodyCell="{ column, record }"> | |
4 | + <template v-if="column.key === 'action'"> | |
5 | + <TableAction | |
6 | + :actions="[ | |
7 | + { | |
8 | + label: '详情', | |
9 | + // icon: 'ic:outline-delete-outline', | |
10 | + onClick: handleDetail.bind(null, record), | |
11 | + }, | |
12 | + ]" | |
13 | + /> | |
14 | + </template> | |
15 | + </template> | |
16 | + </BasicTable> | |
17 | + <BasicDrawer | |
18 | + width="500" | |
19 | + :showFooter="!isApproved && (role === ROLE.ADMIN || role === ROLE.BUSINESS)" | |
20 | + @register="registerDrawer" | |
21 | + title="申请信息" | |
22 | + okText="通过" | |
23 | + @ok="handleTrue" | |
24 | + > | |
25 | + <BaseInfo :baseInfos="baseInfos" /> | |
26 | + <div>{{ fieldInfos.baseFields.join(' , ') }}</div> | |
27 | + <template #appendFooter> | |
28 | + <a-button @click="handleFalse"> 不通过</a-button> | |
29 | + </template> | |
30 | + </BasicDrawer> | |
31 | + <MsgModal v-if="msgVisible" @msg-modal-close="handleMsgModalClose" /> | |
32 | +</template> | |
33 | +<script lang="ts"> | |
34 | + import MsgModal from './MsgModal.vue'; | |
35 | + import { computed, defineComponent, ref } from 'vue'; | |
36 | + import { BasicTable, useTable, TableAction } from '/@/components/Table'; | |
37 | + import { BasicDrawer, useDrawer } from '/@/components/Drawer'; | |
38 | + import { approveAuditApi, getApprovedListApi, getWaitListApi } from '/@/api/project/approve'; | |
39 | + import { getAuditApply, getApplyList } from '/@/api/project/invoice'; | |
40 | + import { | |
41 | + FIELDS_BASE_INFO, | |
42 | + FIELDS_INSPECTION_INFO, | |
43 | + FIELDS_PROFIT_INFO, | |
44 | + FIELDS_REPORT_INFO, | |
45 | + FIELDS_TRACK_STAGE_INFO, | |
46 | + } from '../order/tableData'; | |
47 | + import { find, isEmpty } from 'lodash-es'; | |
48 | + import { ROLE } from '../order//type.d'; | |
49 | + import { useUserStoreWithOut } from '/@/store/modules/user'; | |
50 | + import BaseInfo from './BaseInfo.vue'; | |
51 | + import { createImgPreview } from '/@/components/Preview'; | |
52 | + import { getFormConfig } from './data'; | |
53 | + | |
54 | + const userStore = useUserStoreWithOut(); | |
55 | + | |
56 | + export default defineComponent({ | |
57 | + components: { | |
58 | + BasicTable, | |
59 | + BasicDrawer, | |
60 | + TableAction, | |
61 | + BaseInfo, | |
62 | + MsgModal, | |
63 | + }, | |
64 | + props: { | |
65 | + isApproved: { type: Boolean }, | |
66 | + }, | |
67 | + setup(props) { | |
68 | + // visible 用于msgModal显示隐藏 | |
69 | + const msgVisible = ref(false); | |
70 | + | |
71 | + const checkedKeys = ref<Array<string | number>>([]); | |
72 | + const currentKey = ref('1'); | |
73 | + const [registerDrawer, { openDrawer, closeDrawer }] = useDrawer(); | |
74 | + const fieldInfos = ref({ | |
75 | + baseFields: [], | |
76 | + }); | |
77 | + const baseInfos = ref({}); | |
78 | + const id = ref(''); | |
79 | + | |
80 | + let columns = [ | |
81 | + { | |
82 | + title: '申请人', | |
83 | + dataIndex: 'createBy', | |
84 | + width: 150, | |
85 | + }, | |
86 | + { | |
87 | + title: '审核字段类型', | |
88 | + dataIndex: 'auditRoleCodes', | |
89 | + width: 150, | |
90 | + customRender: (column) => { | |
91 | + const { record } = column || {}; | |
92 | + return record?.auditRoleCodes.includes('business_user') | |
93 | + ? '(基本/跟单/质检)模块' | |
94 | + : '(利润/项目报告书)模块'; | |
95 | + }, | |
96 | + }, | |
97 | + { | |
98 | + title: '内部编号', | |
99 | + dataIndex: 'innerNo', | |
100 | + width: 150, | |
101 | + customRender: (column) => { | |
102 | + const { record } = column || {}; | |
103 | + return record?.orderBaseInfo?.innerNo; | |
104 | + }, | |
105 | + }, | |
106 | + | |
107 | + { | |
108 | + title: '项目号', | |
109 | + dataIndex: 'projectNoPrefix', | |
110 | + width: 150, | |
111 | + }, | |
112 | + { | |
113 | + title: '申请原因', | |
114 | + dataIndex: 'applyRemark', | |
115 | + width: 150, | |
116 | + }, | |
117 | + ]; | |
118 | + | |
119 | + if (props.isApproved) { | |
120 | + columns = columns.concat([ | |
121 | + { | |
122 | + title: '状态', | |
123 | + dataIndex: 'status', | |
124 | + width: 150, | |
125 | + customRender: (column) => { | |
126 | + const { record } = column || {}; | |
127 | + | |
128 | + return record.status === 10 ? '通过' : '拒绝'; | |
129 | + }, | |
130 | + }, | |
131 | + { title: '拒绝原因', dataIndex: 'refuseRemark', width: 250 }, | |
132 | + ]); | |
133 | + } | |
134 | + const [registerTable, { reload }] = useTable({ | |
135 | + scroll: false, | |
136 | + api: props.isApproved ? getApprovedListApi : getWaitListApi, | |
137 | + searchInfo: { type: 0 }, | |
138 | + columns, | |
139 | + useSearchForm: true, | |
140 | + formConfig: getFormConfig('true'), | |
141 | + rowKey: 'id', | |
142 | + actionColumn: { | |
143 | + width: 160, | |
144 | + title: 'Action', | |
145 | + dataIndex: 'action', | |
146 | + // slots: { customRender: 'action' }, | |
147 | + }, | |
148 | + }); | |
149 | + | |
150 | + function onSelect(record, selected) { | |
151 | + if (selected) { | |
152 | + checkedKeys.value = [...checkedKeys.value, record.id]; | |
153 | + } else { | |
154 | + checkedKeys.value = checkedKeys.value.filter((id) => id !== record.id); | |
155 | + } | |
156 | + } | |
157 | + function onSelectAll(selected, selectedRows, changeRows) { | |
158 | + const changeIds = changeRows.map((item) => item.id); | |
159 | + if (selected) { | |
160 | + checkedKeys.value = [...checkedKeys.value, ...changeIds]; | |
161 | + } else { | |
162 | + checkedKeys.value = checkedKeys.value.filter((id) => { | |
163 | + return !changeIds.includes(id); | |
164 | + }); | |
165 | + } | |
166 | + } | |
167 | + function handleEdit(record, e) { | |
168 | + e?.stopPropagation(); | |
169 | + return false; | |
170 | + } | |
171 | + | |
172 | + function handleProfitModal() {} | |
173 | + | |
174 | + async function handleDetail(data) { | |
175 | + fieldInfos.value = { | |
176 | + baseFields: [], | |
177 | + }; | |
178 | + openDrawer(true, { data }); | |
179 | + baseInfos.value = FIELDS_BASE_INFO.map((field) => { | |
180 | + return { | |
181 | + label: field.label, | |
182 | + value: data.orderBaseInfo[field.field], | |
183 | + }; | |
184 | + }).filter((item) => !!item.value); | |
185 | + } | |
186 | + | |
187 | + // async function handleDetail(data) { | |
188 | + // fieldInfos.value = { | |
189 | + // auditRoleCodes: data.auditRoleCodes, | |
190 | + // baseFields: [], | |
191 | + // reportFields: [], | |
192 | + // profitFields: [], | |
193 | + // inspectionStageFields: [], | |
194 | + // trackStageFields: [], | |
195 | + // }; | |
196 | + // openDrawer(true, { data }); | |
197 | + | |
198 | + // !isEmpty(data.fieldInfos.baseFields) && | |
199 | + // Object.entries(data.fieldInfos.baseFields)?.map(([key, value]) => { | |
200 | + // if (value === 'UN_LOCKED') { | |
201 | + // const obj = find(FIELDS_BASE_INFO, { field: key }); | |
202 | + // fieldInfos.value.baseFields.push(obj?.label); | |
203 | + // } | |
204 | + // }); | |
205 | + // !isEmpty(data.fieldInfos.reportFields) && | |
206 | + // Object.entries(data.fieldInfos.reportFields).map(([key, value]) => { | |
207 | + // if (value === 'UN_LOCKED') { | |
208 | + // const obj = find(FIELDS_REPORT_INFO, { field: key }); | |
209 | + // fieldInfos.value.reportFields.push(obj?.label); | |
210 | + // } | |
211 | + // }); | |
212 | + // !isEmpty(data.fieldInfos.profitAnalysisFields) && | |
213 | + // Object.entries(data.fieldInfos.profitAnalysisFields).map(([key, value]) => { | |
214 | + // if (value === 'UN_LOCKED') { | |
215 | + // const obj = find(FIELDS_PROFIT_INFO, { field: key }); | |
216 | + // fieldInfos.value.profitFields.push(obj?.label); | |
217 | + // } | |
218 | + // }); | |
219 | + | |
220 | + // !isEmpty(data.fieldInfos.trackStageFields) && | |
221 | + // Object.entries(data.fieldInfos.trackStageFields).map(([key, value]) => { | |
222 | + // if (value === 'UN_LOCKED') { | |
223 | + // const obj = find(FIELDS_TRACK_STAGE_INFO, { field: key }); | |
224 | + // fieldInfos.value.trackStageFields.push(obj?.label); | |
225 | + // } | |
226 | + // }); | |
227 | + | |
228 | + // !isEmpty(data.fieldInfos.inspectionStageFields) && | |
229 | + // Object.entries(data.fieldInfos.inspectionStageFields).map(([key, value]) => { | |
230 | + // if (value === 'UN_LOCKED') { | |
231 | + // const obj = find(FIELDS_INSPECTION_INFO, { field: key }); | |
232 | + // fieldInfos.value.inspectionStageFields.push(obj?.label); | |
233 | + // } | |
234 | + // }); | |
235 | + | |
236 | + // id.value = data.id; | |
237 | + // baseInfos.value = FIELDS_BASE_INFO.map((field) => { | |
238 | + // return { | |
239 | + // label: field.label, | |
240 | + // value: data.orderBaseInfo[field.field], | |
241 | + // }; | |
242 | + // }).filter((item) => !!item.value); | |
243 | + // } | |
244 | + | |
245 | + async function handleTrue() { | |
246 | + await approveAuditApi({ status: 10, id: id.value }); | |
247 | + reload(); | |
248 | + closeDrawer(); | |
249 | + } | |
250 | + | |
251 | + async function handleFalse() { | |
252 | + msgVisible.value = true; | |
253 | + } | |
254 | + | |
255 | + const role = computed(() => { | |
256 | + return userStore.getUserInfo?.roleSmallVO?.code; | |
257 | + }); | |
258 | + | |
259 | + // 定义MsgModalClose的事件,方便子组件调用 | |
260 | + const handleMsgModalClose = async (data) => { | |
261 | + if (data) { | |
262 | + await approveAuditApi({ status: 20, id: id.value, refuseRemark: data }); | |
263 | + reload(); | |
264 | + closeDrawer(); | |
265 | + } | |
266 | + msgVisible.value = false; | |
267 | + }; | |
268 | + | |
269 | + const handlePreview = (url) => { | |
270 | + createImgPreview({ imageList: [url], defaultWidth: 500 }); | |
271 | + return false; | |
272 | + }; | |
273 | + | |
274 | + return { | |
275 | + handleProfitModal, | |
276 | + registerTable, | |
277 | + checkedKeys, | |
278 | + currentKey, | |
279 | + onSelect, | |
280 | + handleEdit, | |
281 | + onSelectAll, | |
282 | + handleDetail, | |
283 | + registerDrawer, | |
284 | + fieldInfos, | |
285 | + baseInfos, | |
286 | + handleTrue, | |
287 | + handleFalse, | |
288 | + ROLE, | |
289 | + role, | |
290 | + msgVisible, | |
291 | + handleMsgModalClose, | |
292 | + handlePreview, | |
293 | + }; | |
294 | + }, | |
295 | + }); | |
296 | +</script> | ... | ... |
src/views/project/approve/index.vue
... | ... | @@ -34,6 +34,18 @@ |
34 | 34 | > |
35 | 35 | <PayPanel /> |
36 | 36 | </a-tab-pane> |
37 | + <a-tab-pane | |
38 | + key="11" | |
39 | + tab="分析表字段审核" | |
40 | + v-if=" | |
41 | + role == ROLE.FINANCE || | |
42 | + role == ROLE.ADMIN || | |
43 | + role == ROLE.BUSINESS || | |
44 | + role == ROLE.TRACKER | |
45 | + " | |
46 | + > | |
47 | + <ProfitFieldPanel /> | |
48 | + </a-tab-pane> | |
37 | 49 | <a-tab-pane key="2" tab="字段已审核" v-if="role !== ROLE.FINANCE"> |
38 | 50 | <FieldPanel isApproved /> |
39 | 51 | </a-tab-pane> |
... | ... | @@ -67,6 +79,18 @@ |
67 | 79 | > |
68 | 80 | <PayPanel isApproved /> |
69 | 81 | </a-tab-pane> |
82 | + <a-tab-pane | |
83 | + key="12" | |
84 | + tab="分析表字段已审核" | |
85 | + v-if=" | |
86 | + role == ROLE.FINANCE || | |
87 | + role == ROLE.ADMIN || | |
88 | + role == ROLE.BUSINESS || | |
89 | + role == ROLE.TRACKER | |
90 | + " | |
91 | + > | |
92 | + <ProfitFieldPanel isApproved /> | |
93 | + </a-tab-pane> | |
70 | 94 | </a-tabs> |
71 | 95 | </div> |
72 | 96 | </template> |
... | ... | @@ -79,6 +103,7 @@ |
79 | 103 | import FieldPanel from './FieldPanel.vue'; |
80 | 104 | import ReceivePanel from './ReceivePanel.vue'; |
81 | 105 | import PayPanel from './PayPanel.vue'; |
106 | + import ProfitFieldPanel from './ProfitFieldPanel.vue'; | |
82 | 107 | import { useOrderStoreWithOut } from '/@/store/modules/order'; |
83 | 108 | import { useUserStoreWithOut } from '/@/store/modules/user'; |
84 | 109 | |
... | ... | @@ -98,6 +123,7 @@ |
98 | 123 | ProfitPanel, |
99 | 124 | ReceivePanel, |
100 | 125 | PayPanel, |
126 | + ProfitFieldPanel, | |
101 | 127 | }, |
102 | 128 | setup() { |
103 | 129 | const checkedKeys = ref<Array<string | number>>([]); | ... | ... |
src/views/project/finance/financeProfit/ProductProfit/InnerData/ApproveReason.vue
0 → 100644
1 | +<template> | |
2 | + <BasicModal | |
3 | + v-bind="$attrs" | |
4 | + destroyOnClose | |
5 | + @register="register" | |
6 | + title="申请原因" | |
7 | + :helpMessage="['提示1', '提示2']" | |
8 | + @open-change="handleShow" | |
9 | + :bodyStyle="{ height: '200px' }" | |
10 | + @ok="handleOk" | |
11 | + z-index="9999" | |
12 | + > | |
13 | + <a-textarea v-model:value="input" :rows="7" /> | |
14 | + </BasicModal> | |
15 | +</template> | |
16 | +<script lang="ts" setup> | |
17 | + import { ref, watch } from 'vue'; | |
18 | + import { BasicModal, useModalInner } from '@/components/Modal'; | |
19 | + import { orderAuth } from '/@/api/project/order'; | |
20 | + import { getPackageApplyEdit } from '/@/api/project/invoice'; | |
21 | + | |
22 | + const emit = defineEmits(['success']); | |
23 | + const input = ref(''); | |
24 | + const baseFieldValues = ref(); | |
25 | + const [register, { setModalProps, redoModalHeight, closeModal }] = useModalInner(async (data) => { | |
26 | + baseFieldValues.value = data.data; | |
27 | + baseFieldValues.value.orderId = data.id; | |
28 | + }); | |
29 | + async function handleOk() { | |
30 | + baseFieldValues.value.applyRemark = input.value; | |
31 | + await getPackageApplyEdit({ | |
32 | + orderId: baseFieldValues.value.orderId, | |
33 | + productionActualPrice: baseFieldValues.value.productionActualPrice, | |
34 | + productionDepartmentPredictPrice: baseFieldValues.value.productionDepartmentPredictPrice, | |
35 | + }); | |
36 | + emit('success'); | |
37 | + setTimeout(() => { | |
38 | + closeModal(); | |
39 | + }, 50); | |
40 | + } | |
41 | + function handleShow() { | |
42 | + input.value = ''; | |
43 | + closeModal(); | |
44 | + } | |
45 | +</script> | ... | ... |
src/views/project/finance/financeProfit/ProductProfit/InnerData/CheckDetail.vue
... | ... | @@ -13,8 +13,7 @@ |
13 | 13 | okText="申请" |
14 | 14 | ><input /> |
15 | 15 | <div> |
16 | - <template v-if="role === ROLE.ADMIN || role === ROLE.TRACKER"> | |
17 | - <h3>基本信息</h3> | |
16 | + <template v-if="role === ROLE.ADMIN || role === ROLE.FINANCE"> | |
18 | 17 | <BasicForm @register="registerForm" /> |
19 | 18 | </template> |
20 | 19 | </div> |
... | ... | @@ -24,43 +23,38 @@ |
24 | 23 | <a-button type="primary" @click="onGoFormDetail"> 返回编辑</a-button> |
25 | 24 | </template> --> |
26 | 25 | </BasicDrawer> |
26 | + <ApproveReason @register="approveReasonRegister" @success="handleCloseModal" /> | |
27 | 27 | </div> |
28 | 28 | </template> |
29 | 29 | <script lang="ts"> |
30 | 30 | import { computed, defineComponent, reactive, ref } from 'vue'; |
31 | 31 | import { BasicForm, useForm } from '/@/components/Form/index'; |
32 | - import { orderAuth } from '/@/api/project/order'; | |
32 | + import { getPackageApplyEdit } from '/@/api/project/invoice'; | |
33 | 33 | import { ROLE } from '../../../financeList/type.d'; |
34 | 34 | import { useModal } from '/@/components/Modal'; |
35 | - | |
35 | + import ApproveReason from './ApproveReason.vue'; | |
36 | 36 | import { BasicDrawer, useDrawerInner } from '/@/components/Drawer'; |
37 | 37 | import { FIELDS_BASE_INFO } from './tableData'; |
38 | 38 | import { useUserStoreWithOut } from '/@/store/modules/user'; |
39 | 39 | |
40 | 40 | const userStore = useUserStoreWithOut(); |
41 | 41 | const getSchema = (fields) => |
42 | - fields | |
43 | - .map((item) => ({ | |
44 | - field: `${item.field}`, | |
45 | - dataIndex: `${item.field}`, | |
46 | - label: item.label, | |
47 | - component: 'Switch', | |
48 | - componentProps: { | |
49 | - checkedValue: 'UN_LOCKED', | |
50 | - unCheckedValue: 'LOCKED', | |
51 | - }, | |
52 | - colProps: { | |
53 | - span: 6, | |
54 | - }, | |
55 | - })) | |
56 | - .filter( | |
57 | - (item) => | |
58 | - // item.field !== 'packetPrice' && | |
59 | - item.field !== 'exchangeRate' && item.field !== 'profitRate', | |
60 | - ); | |
42 | + fields.map((item) => ({ | |
43 | + field: `${item.field}`, | |
44 | + dataIndex: `${item.field}`, | |
45 | + label: item.label, | |
46 | + component: 'Switch', | |
47 | + componentProps: { | |
48 | + checkedValue: 'UN_LOCKED', | |
49 | + unCheckedValue: 'LOCKED', | |
50 | + }, | |
51 | + colProps: { | |
52 | + span: 8, | |
53 | + }, | |
54 | + })); | |
61 | 55 | |
62 | 56 | export default defineComponent({ |
63 | - components: { BasicDrawer, BasicForm }, | |
57 | + components: { BasicDrawer, BasicForm, ApproveReason }, | |
64 | 58 | props: { |
65 | 59 | onGoFormDetail: { |
66 | 60 | type: Function, |
... | ... | @@ -70,17 +64,19 @@ |
70 | 64 | const id = ref(''); |
71 | 65 | const schemas = getSchema(FIELDS_BASE_INFO); |
72 | 66 | const [registerForm, { getFieldsValue }] = useForm({ |
73 | - labelWidth: 120, | |
67 | + labelWidth: 180, | |
74 | 68 | schemas, |
75 | 69 | showActionButtonGroup: false, |
76 | 70 | actionColOptions: { |
77 | 71 | span: 24, |
78 | 72 | }, |
79 | 73 | }); |
74 | + const [approveReasonRegister, { openModal: openApproveReasonDrawer }] = useModal(); | |
75 | + | |
80 | 76 | const lockFields = reactive({}); |
81 | 77 | const [register, { closeDrawer }] = useDrawerInner((data) => { |
82 | 78 | Object.assign(lockFields, data.lockFields); |
83 | - id.value = data.id; | |
79 | + id.value = data.orderId; | |
84 | 80 | }); |
85 | 81 | function handleCloseModal() { |
86 | 82 | closeDrawer(); |
... | ... | @@ -92,32 +88,33 @@ |
92 | 88 | |
93 | 89 | const handleSubmit = async () => { |
94 | 90 | const baseFieldValues = getFieldsValue(); |
91 | + console.log(baseFieldValues, '5656baseFieldValues'); | |
92 | + openApproveReasonDrawer(true, { | |
93 | + data: baseFieldValues, | |
94 | + id: id.value, | |
95 | + }); | |
96 | + // await getPackageApplyEdit({ | |
97 | + // orderId: id.value, | |
98 | + // productionActualPrice: baseFieldValues.productionActualPrice, | |
99 | + // productionDepartmentPredictPrice: baseFieldValues.productionDepartmentPredictPrice, | |
100 | + // }); | |
101 | + // if (baseFieldValues) { | |
102 | + // FIELDS_BASE_INFO.map( | |
103 | + // ({ field }) => | |
104 | + // (baseFieldValues[field] = | |
105 | + // baseFieldValues[field] === 'UN_LOCKED' ? 'UN_LOCKED' : 'LOCKED'), | |
106 | + // ); | |
107 | + // } | |
108 | + // const values = Object.assign({ orderId: id.value }, { baseFields: baseFieldValues }); | |
95 | 109 | |
96 | - if (baseFieldValues) { | |
97 | - FIELDS_BASE_INFO.map( | |
98 | - ({ field }) => | |
99 | - (baseFieldValues[field] = | |
100 | - baseFieldValues[field] === 'UN_LOCKED' ? 'UN_LOCKED' : 'LOCKED'), | |
101 | - ); | |
102 | - } | |
103 | - const values = Object.assign({ orderId: id.value }, { baseFields: baseFieldValues }); | |
110 | + // if (values.baseFields && values.baseFields.packetActualRmbTotalPrice === 'UN_LOCKED') { | |
111 | + // console.log(values, '5656values1'); | |
112 | + // } else { | |
113 | + // // await orderAuth(values); | |
114 | + // console.log(values, '5656values2'); | |
104 | 115 | |
105 | - if ( | |
106 | - values.baseFields && | |
107 | - (values.baseFields.projectNo === 'UN_LOCKED' || | |
108 | - values.baseFields.productionDepartment === 'UN_LOCKED' || | |
109 | - values.baseFields.innerNo === 'UN_LOCKED' || | |
110 | - values.baseFields.customerCode === 'UN_LOCKED' || | |
111 | - values.baseFields.customerPo === 'UN_LOCKED' || | |
112 | - values.baseFields.customerStyle === 'UN_LOCKED') | |
113 | - ) { | |
114 | - openReasonModal(true, { | |
115 | - data: values, | |
116 | - }); | |
117 | - } else { | |
118 | - await orderAuth(values); | |
119 | - closeDrawer(); | |
120 | - } | |
116 | + // closeDrawer(); | |
117 | + // } | |
121 | 118 | }; |
122 | 119 | |
123 | 120 | return { |
... | ... | @@ -126,6 +123,8 @@ |
126 | 123 | registerForm, |
127 | 124 | handleSubmit, |
128 | 125 | handleCloseModal, |
126 | + approveReasonRegister, | |
127 | + openApproveReasonDrawer, | |
129 | 128 | ROLE, |
130 | 129 | role, |
131 | 130 | }; | ... | ... |
src/views/project/finance/financeProfit/ProductProfit/InnerData/data.tsx
... | ... | @@ -3,7 +3,70 @@ import { BasicColumn } from '@/components/Table'; |
3 | 3 | import { func } from 'vue-types'; |
4 | 4 | import { h, ref } from 'vue'; |
5 | 5 | import { FilePptOutlined } from '@ant-design/icons-vue'; |
6 | +import { queryNoOptions } from '/@/api/project/order'; | |
7 | +import { useOrderStoreWithOut } from '/@/store/modules/order'; | |
8 | +import { useOrderInfo } from '/@/hooks/component/order'; | |
6 | 9 | |
10 | +const innerNoOptions = ref([]); | |
11 | +const projectNoOptions = ref([]); | |
12 | +const orderStore = useOrderStoreWithOut(); | |
13 | +const { | |
14 | + customerCode, | |
15 | + productionDepartment, | |
16 | +} = useOrderInfo(orderStore); | |
17 | +export const searchFormSchema = [ | |
18 | + { | |
19 | + title: '客户编码', | |
20 | + dataIndex: 'customerCode', | |
21 | + width: 150, | |
22 | + }, | |
23 | + { | |
24 | + field: 'projectNo', | |
25 | + label: '项目号', | |
26 | + component: 'Select', | |
27 | + colProps: { span: 8 }, | |
28 | + | |
29 | + componentProps: { | |
30 | + options: projectNoOptions, | |
31 | + showSearch: true, | |
32 | + mode: 'multiple', | |
33 | + onSearch: async (value: any) => { | |
34 | + projectNoOptions.value = await queryNoOptions('projectNo', value); | |
35 | + }, | |
36 | + // onSearch: async (value: any) => { | |
37 | + // projectNoOptions.value = await queryNoOptions('projectNo', value); | |
38 | + // }, | |
39 | + }, | |
40 | + }, | |
41 | + { | |
42 | + field: 'productionDepartment', | |
43 | + label: '生产科', | |
44 | + component: 'Select', | |
45 | + colProps: { span: 8 }, | |
46 | + | |
47 | + componentProps: { | |
48 | + mode: 'multiple', | |
49 | + | |
50 | + options: productionDepartment, | |
51 | + showSearch: true, | |
52 | + }, | |
53 | + }, | |
54 | + { | |
55 | + field: 'innerNo', | |
56 | + label: '内部编号', | |
57 | + component: 'Select', | |
58 | + colProps: { span: 8 }, | |
59 | + | |
60 | + componentProps: { | |
61 | + options: innerNoOptions, | |
62 | + showSearch: true, | |
63 | + mode: 'multiple', | |
64 | + onSearch: async (value: any) => { | |
65 | + innerNoOptions.value = await queryNoOptions('innerNo', value); | |
66 | + }, | |
67 | + }, | |
68 | + }, | |
69 | +] | |
7 | 70 | // export const COLUMNS = [ |
8 | 71 | // { |
9 | 72 | // title: '客户编码', | ... | ... |
src/views/project/finance/financeProfit/ProductProfit/InnerData/tableData.tsx
... | ... | @@ -21,74 +21,18 @@ const orderStore = useOrderStoreWithOut(); |
21 | 21 | // 基本信息 |
22 | 22 | export const FIELDS_BASE_INFO = [ |
23 | 23 | { |
24 | - field: 'customerCode', | |
24 | + field: 'productionDepartmentPredictPrice', | |
25 | 25 | component: 'Select', |
26 | - labelWidth: 150, | |
27 | - label: '客户编码', | |
28 | - rules: [{ required: true }], | |
29 | - }, | |
30 | - { | |
31 | - field: 'projectNo', | |
32 | - component: 'Input', | |
33 | - labelWidth: 150, | |
34 | - label: '项目号', | |
26 | + labelWidth: 180, | |
27 | + label: '生产科预算金额', | |
35 | 28 | rules: [{ required: true }], |
36 | 29 | }, |
37 | 30 | { |
38 | - field: 'productionDepartment', | |
31 | + field: 'productionActualPrice', | |
39 | 32 | component: 'Select', |
40 | - // componentProps: { | |
41 | - // options: productionDepartmentOptions, | |
42 | - // }, | |
43 | - labelWidth: 150, | |
44 | - label: '生产科', | |
45 | - rules: [{ required: true }], | |
46 | - }, | |
47 | - | |
48 | - { | |
49 | - field: 'innerNo', | |
50 | - component: 'Input', | |
51 | - labelWidth: 150, | |
52 | - label: '内部编号', | |
53 | - rules: [ | |
54 | - { required: true }, | |
55 | - { | |
56 | - validator: async (rule, value) => { | |
57 | - if (value.includes(' ')) { | |
58 | - return Promise.reject(); | |
59 | - } | |
60 | - return Promise.resolve(); | |
61 | - }, | |
62 | - message: '内容存在空格,请检查', | |
63 | - trigger: ['change', 'blur'], | |
64 | - }, | |
65 | - ], | |
66 | - }, | |
67 | - { | |
68 | - field: 'customerPo', | |
69 | - component: 'Input', | |
70 | 33 | labelWidth: 150, |
71 | - label: '客户po号', | |
34 | + label: '实际发生费用', | |
72 | 35 | rules: [{ required: true }], |
73 | 36 | }, |
74 | - { | |
75 | - field: 'customerStyle', | |
76 | - component: 'Input', | |
77 | - labelWidth: 150, | |
78 | - label: '客户STYLE', | |
79 | - rules: [ | |
80 | - { required: true }, | |
81 | - { | |
82 | - validator: async (rule, value) => { | |
83 | - if (value.includes(' ')) { | |
84 | - return Promise.reject(); | |
85 | - } | |
86 | - return Promise.resolve(); | |
87 | - }, | |
88 | - message: '内容存在空格,请检查', | |
89 | - trigger: ['change', 'blur'], | |
90 | - }, | |
91 | - ], | |
92 | - }, | |
93 | 37 | ]; |
94 | 38 | ... | ... |
src/views/project/finance/financeProfit/ProductProfit/InnerProduce/data.tsx
... | ... | @@ -4,6 +4,9 @@ import { func } from 'vue-types'; |
4 | 4 | import { h, ref } from 'vue'; |
5 | 5 | import { FilePptOutlined } from '@ant-design/icons-vue'; |
6 | 6 | import axios from 'axios'; |
7 | +import { queryNoOptions } from '/@/api/project/order'; | |
8 | +import { useOrderStoreWithOut } from '/@/store/modules/order'; | |
9 | +import { useOrderInfo } from '/@/hooks/component/order'; | |
7 | 10 | |
8 | 11 | // export const COLUMNS = [ |
9 | 12 | // { |
... | ... | @@ -20,6 +23,73 @@ import axios from 'axios'; |
20 | 23 | // scopedSlots: { customRender: 'name' } |
21 | 24 | // }, |
22 | 25 | // ]; |
26 | +const innerNoOptions = ref([]); | |
27 | +const projectNoOptions = ref([]); | |
28 | +const orderStore = useOrderStoreWithOut(); | |
29 | +const { | |
30 | + customerCode, | |
31 | + productionDepartment, | |
32 | +} = useOrderInfo(orderStore); | |
33 | +export const searchFormSchema = [ | |
34 | + { | |
35 | + field: 'customerCode', | |
36 | + label: '客户编码', | |
37 | + component: 'Select', | |
38 | + colProps: { span: 8 }, | |
39 | + | |
40 | + componentProps: { | |
41 | + options: customerCode, | |
42 | + showSearch: true, | |
43 | + mode: 'multiple', | |
44 | + }, | |
45 | + }, | |
46 | + { | |
47 | + field: 'projectNo', | |
48 | + label: '项目号', | |
49 | + component: 'Select', | |
50 | + colProps: { span: 8 }, | |
51 | + | |
52 | + componentProps: { | |
53 | + options: projectNoOptions, | |
54 | + showSearch: true, | |
55 | + mode: 'multiple', | |
56 | + onSearch: async (value: any) => { | |
57 | + projectNoOptions.value = await queryNoOptions('projectNo', value); | |
58 | + }, | |
59 | + // onSearch: async (value: any) => { | |
60 | + // projectNoOptions.value = await queryNoOptions('projectNo', value); | |
61 | + // }, | |
62 | + }, | |
63 | + }, | |
64 | + { | |
65 | + field: 'productionDepartment', | |
66 | + label: '生产科', | |
67 | + component: 'Select', | |
68 | + colProps: { span: 8 }, | |
69 | + | |
70 | + componentProps: { | |
71 | + mode: 'multiple', | |
72 | + | |
73 | + options: productionDepartment, | |
74 | + showSearch: true, | |
75 | + }, | |
76 | + }, | |
77 | + { | |
78 | + field: 'innerNo', | |
79 | + label: '内部编号', | |
80 | + component: 'Select', | |
81 | + colProps: { span: 8 }, | |
82 | + | |
83 | + componentProps: { | |
84 | + options: innerNoOptions, | |
85 | + showSearch: true, | |
86 | + mode: 'multiple', | |
87 | + onSearch: async (value: any) => { | |
88 | + innerNoOptions.value = await queryNoOptions('innerNo', value); | |
89 | + }, | |
90 | + }, | |
91 | + }, | |
92 | +] | |
23 | 93 | export const COLUMNS = [ |
24 | 94 | { |
25 | 95 | title: '客户编码', | ... | ... |
src/views/project/finance/financeProfit/ProductProfit/InnerProduce/index.vue
... | ... | @@ -38,16 +38,18 @@ |
38 | 38 | <script setup lang="ts"> |
39 | 39 | import { BasicTable, useTable, TableAction } from '/@/components/Table'; |
40 | 40 | import { getInnerProduceProfit } from '@/api/project/invoice'; |
41 | - import { COLUMNS } from './data'; | |
41 | + import { searchFormSchema, COLUMNS } from './data'; | |
42 | 42 | import { BasicModal, useModal } from '/@/components/Modal'; |
43 | 43 | import { useMessage } from '/@/hooks/web/useMessage'; |
44 | - import { ref } from 'vue'; | |
44 | + import { onMounted, ref } from 'vue'; | |
45 | 45 | import { useDrawer } from '/@/components/Drawer'; |
46 | 46 | import FinanceEdit from './FinanceEdit.vue'; |
47 | + import { useOrderStoreWithOut } from '/@/store/modules/order'; | |
47 | 48 | |
48 | 49 | const { createMessage } = useMessage(); |
49 | 50 | const { error } = createMessage; |
50 | 51 | const message = ref(); |
52 | + const orderStore = useOrderStoreWithOut(); | |
51 | 53 | const [registerFinanceEdit, { openDrawer: openFinanceEdit }] = useDrawer(); |
52 | 54 | const handleOk = (record) => { |
53 | 55 | // 修改父组件的状态 |
... | ... | @@ -63,13 +65,19 @@ |
63 | 65 | api: getInnerProduceProfit, |
64 | 66 | bordered: true, |
65 | 67 | columns: COLUMNS, |
68 | + clickToRowSelect: false, | |
66 | 69 | rowKey: 'id', |
70 | + formConfig: { | |
71 | + labelWidth: 120, | |
72 | + schemas: searchFormSchema, | |
73 | + autoSubmitOnEnter: true, | |
74 | + }, | |
67 | 75 | useSearchForm: true, |
68 | - // actionColumn: { | |
69 | - // width: 240, | |
70 | - // title: 'Action', | |
71 | - // dataIndex: 'action', | |
72 | - // }, | |
76 | + showTableSetting: true, | |
77 | + showIndexColumn: false, | |
78 | + tableSetting: { | |
79 | + setting: false, | |
80 | + }, | |
73 | 81 | }); |
74 | 82 | |
75 | 83 | // function createActions(record: any): any[] { |
... | ... | @@ -115,6 +123,10 @@ |
115 | 123 | // ]; |
116 | 124 | // } |
117 | 125 | |
126 | + onMounted(async () => { | |
127 | + await orderStore.getDict(); | |
128 | + }); | |
129 | + | |
118 | 130 | function handleFinanceEdit(record) { |
119 | 131 | openFinanceEdit(true, { |
120 | 132 | data: record, | ... | ... |
src/views/project/finance/financeProfit/ServiceProfit/PackageProfit/ApproveReason.vue
0 → 100644
1 | +<template> | |
2 | + <BasicModal | |
3 | + v-bind="$attrs" | |
4 | + destroyOnClose | |
5 | + @register="register" | |
6 | + title="申请原因" | |
7 | + :helpMessage="['提示1', '提示2']" | |
8 | + @open-change="handleShow" | |
9 | + :bodyStyle="{ height: '200px' }" | |
10 | + @ok="handleOk" | |
11 | + z-index="9999" | |
12 | + > | |
13 | + <a-textarea v-model:value="input" :rows="7" /> | |
14 | + </BasicModal> | |
15 | +</template> | |
16 | +<script lang="ts" setup> | |
17 | + import { ref, watch } from 'vue'; | |
18 | + import { BasicModal, useModalInner } from '@/components/Modal'; | |
19 | + import { orderAuth } from '/@/api/project/order'; | |
20 | + import { getPackageApplyEdit } from '/@/api/project/invoice'; | |
21 | + | |
22 | + const emit = defineEmits(['success']); | |
23 | + const input = ref(''); | |
24 | + const baseFieldValues = ref(); | |
25 | + const [register, { setModalProps, redoModalHeight, closeModal }] = useModalInner(async (data) => { | |
26 | + baseFieldValues.value = data.data; | |
27 | + baseFieldValues.value.orderId = data.id; | |
28 | + }); | |
29 | + async function handleOk() { | |
30 | + baseFieldValues.value.applyRemark = input.value; | |
31 | + await getPackageApplyEdit({ | |
32 | + orderId: baseFieldValues.value.orderId, | |
33 | + packetActualRmbTotalPrice: baseFieldValues.value.packetActualRmbTotalPrice, | |
34 | + applyRemark: baseFieldValues.value.applyRemark, | |
35 | + }); | |
36 | + emit('success'); | |
37 | + setTimeout(() => { | |
38 | + closeModal(); | |
39 | + }, 50); | |
40 | + } | |
41 | + function handleShow() { | |
42 | + input.value = ''; | |
43 | + closeModal(); | |
44 | + } | |
45 | +</script> | ... | ... |
src/views/project/finance/financeProfit/ServiceProfit/PackageProfit/CheckDetail.vue
... | ... | @@ -13,8 +13,7 @@ |
13 | 13 | okText="申请" |
14 | 14 | ><input /> |
15 | 15 | <div> |
16 | - <template v-if="role === ROLE.ADMIN || role === ROLE.TRACKER"> | |
17 | - <h3>基本信息</h3> | |
16 | + <template v-if="role === ROLE.ADMIN || role === ROLE.FINANCE"> | |
18 | 17 | <BasicForm @register="registerForm" /> |
19 | 18 | </template> |
20 | 19 | </div> |
... | ... | @@ -24,15 +23,16 @@ |
24 | 23 | <a-button type="primary" @click="onGoFormDetail"> 返回编辑</a-button> |
25 | 24 | </template> --> |
26 | 25 | </BasicDrawer> |
26 | + <ApproveReason @register="approveReasonRegister" @success="handleCloseModal" /> | |
27 | 27 | </div> |
28 | 28 | </template> |
29 | 29 | <script lang="ts"> |
30 | 30 | import { computed, defineComponent, reactive, ref } from 'vue'; |
31 | 31 | import { BasicForm, useForm } from '/@/components/Form/index'; |
32 | - import { orderAuth } from '/@/api/project/order'; | |
32 | + import { getPackageApplyEdit } from '/@/api/project/invoice'; | |
33 | 33 | import { ROLE } from '../../../financeList/type.d'; |
34 | 34 | import { useModal } from '/@/components/Modal'; |
35 | - | |
35 | + import ApproveReason from './ApproveReason.vue'; | |
36 | 36 | import { BasicDrawer, useDrawerInner } from '/@/components/Drawer'; |
37 | 37 | import { FIELDS_BASE_INFO } from './tableData'; |
38 | 38 | import { useUserStoreWithOut } from '/@/store/modules/user'; |
... | ... | @@ -60,7 +60,7 @@ |
60 | 60 | ); |
61 | 61 | |
62 | 62 | export default defineComponent({ |
63 | - components: { BasicDrawer, BasicForm }, | |
63 | + components: { BasicDrawer, BasicForm, ApproveReason }, | |
64 | 64 | props: { |
65 | 65 | onGoFormDetail: { |
66 | 66 | type: Function, |
... | ... | @@ -70,17 +70,20 @@ |
70 | 70 | const id = ref(''); |
71 | 71 | const schemas = getSchema(FIELDS_BASE_INFO); |
72 | 72 | const [registerForm, { getFieldsValue }] = useForm({ |
73 | - labelWidth: 120, | |
73 | + labelWidth: 180, | |
74 | 74 | schemas, |
75 | 75 | showActionButtonGroup: false, |
76 | 76 | actionColOptions: { |
77 | 77 | span: 24, |
78 | 78 | }, |
79 | 79 | }); |
80 | + const [approveReasonRegister, { openModal: openApproveReasonDrawer }] = useModal(); | |
81 | + | |
80 | 82 | const lockFields = reactive({}); |
81 | 83 | const [register, { closeDrawer }] = useDrawerInner((data) => { |
84 | + console.log(data, '5656datach'); | |
82 | 85 | Object.assign(lockFields, data.lockFields); |
83 | - id.value = data.id; | |
86 | + id.value = data.orderId; | |
84 | 87 | }); |
85 | 88 | function handleCloseModal() { |
86 | 89 | closeDrawer(); |
... | ... | @@ -92,32 +95,32 @@ |
92 | 95 | |
93 | 96 | const handleSubmit = async () => { |
94 | 97 | const baseFieldValues = getFieldsValue(); |
98 | + console.log(baseFieldValues, '5656baseFieldValues'); | |
99 | + openApproveReasonDrawer(true, { | |
100 | + data: baseFieldValues, | |
101 | + id: id.value, | |
102 | + }); | |
103 | + // await getPackageApplyEdit({ | |
104 | + // orderId: id.value, | |
105 | + // packetActualRmbTotalPrice: baseFieldValues.packetActualRmbTotalPrice, | |
106 | + // }); | |
107 | + // if (baseFieldValues) { | |
108 | + // FIELDS_BASE_INFO.map( | |
109 | + // ({ field }) => | |
110 | + // (baseFieldValues[field] = | |
111 | + // baseFieldValues[field] === 'UN_LOCKED' ? 'UN_LOCKED' : 'LOCKED'), | |
112 | + // ); | |
113 | + // } | |
114 | + // const values = Object.assign({ orderId: id.value }, { baseFields: baseFieldValues }); | |
95 | 115 | |
96 | - if (baseFieldValues) { | |
97 | - FIELDS_BASE_INFO.map( | |
98 | - ({ field }) => | |
99 | - (baseFieldValues[field] = | |
100 | - baseFieldValues[field] === 'UN_LOCKED' ? 'UN_LOCKED' : 'LOCKED'), | |
101 | - ); | |
102 | - } | |
103 | - const values = Object.assign({ orderId: id.value }, { baseFields: baseFieldValues }); | |
116 | + // if (values.baseFields && values.baseFields.packetActualRmbTotalPrice === 'UN_LOCKED') { | |
117 | + // console.log(values, '5656values1'); | |
118 | + // } else { | |
119 | + // // await orderAuth(values); | |
120 | + // console.log(values, '5656values2'); | |
104 | 121 | |
105 | - if ( | |
106 | - values.baseFields && | |
107 | - (values.baseFields.projectNo === 'UN_LOCKED' || | |
108 | - values.baseFields.productionDepartment === 'UN_LOCKED' || | |
109 | - values.baseFields.innerNo === 'UN_LOCKED' || | |
110 | - values.baseFields.customerCode === 'UN_LOCKED' || | |
111 | - values.baseFields.customerPo === 'UN_LOCKED' || | |
112 | - values.baseFields.customerStyle === 'UN_LOCKED') | |
113 | - ) { | |
114 | - openReasonModal(true, { | |
115 | - data: values, | |
116 | - }); | |
117 | - } else { | |
118 | - await orderAuth(values); | |
119 | - closeDrawer(); | |
120 | - } | |
122 | + // closeDrawer(); | |
123 | + // } | |
121 | 124 | }; |
122 | 125 | |
123 | 126 | return { |
... | ... | @@ -126,6 +129,8 @@ |
126 | 129 | registerForm, |
127 | 130 | handleSubmit, |
128 | 131 | handleCloseModal, |
132 | + approveReasonRegister, | |
133 | + openApproveReasonDrawer, | |
129 | 134 | ROLE, |
130 | 135 | role, |
131 | 136 | }; | ... | ... |
src/views/project/finance/financeProfit/ServiceProfit/PackageProfit/data.tsx
... | ... | @@ -3,7 +3,70 @@ import { BasicColumn } from '@/components/Table'; |
3 | 3 | import { func } from 'vue-types'; |
4 | 4 | import { h, ref } from 'vue'; |
5 | 5 | import { FilePptOutlined } from '@ant-design/icons-vue'; |
6 | +import { queryNoOptions } from '/@/api/project/order'; | |
7 | +import { useOrderStoreWithOut } from '/@/store/modules/order'; | |
8 | +import { useOrderInfo } from '/@/hooks/component/order'; | |
6 | 9 | |
10 | +const innerNoOptions = ref([]); | |
11 | +const projectNoOptions = ref([]); | |
12 | +const orderStore = useOrderStoreWithOut(); | |
13 | +const { | |
14 | + customerCode, | |
15 | + productionDepartment, | |
16 | +} = useOrderInfo(orderStore); | |
17 | +export const searchFormSchema = [ | |
18 | + { | |
19 | + title: '客户编码', | |
20 | + dataIndex: 'customerCode', | |
21 | + width: 150, | |
22 | + }, | |
23 | + { | |
24 | + field: 'projectNo', | |
25 | + label: '项目号', | |
26 | + component: 'Select', | |
27 | + colProps: { span: 8 }, | |
28 | + | |
29 | + componentProps: { | |
30 | + options: projectNoOptions, | |
31 | + showSearch: true, | |
32 | + mode: 'multiple', | |
33 | + onSearch: async (value: any) => { | |
34 | + projectNoOptions.value = await queryNoOptions('projectNo', value); | |
35 | + }, | |
36 | + // onSearch: async (value: any) => { | |
37 | + // projectNoOptions.value = await queryNoOptions('projectNo', value); | |
38 | + // }, | |
39 | + }, | |
40 | + }, | |
41 | + { | |
42 | + field: 'productionDepartment', | |
43 | + label: '生产科', | |
44 | + component: 'Select', | |
45 | + colProps: { span: 8 }, | |
46 | + | |
47 | + componentProps: { | |
48 | + mode: 'multiple', | |
49 | + | |
50 | + options: productionDepartment, | |
51 | + showSearch: true, | |
52 | + }, | |
53 | + }, | |
54 | + { | |
55 | + field: 'innerNo', | |
56 | + label: '内部编号', | |
57 | + component: 'Select', | |
58 | + colProps: { span: 8 }, | |
59 | + | |
60 | + componentProps: { | |
61 | + options: innerNoOptions, | |
62 | + showSearch: true, | |
63 | + mode: 'multiple', | |
64 | + onSearch: async (value: any) => { | |
65 | + innerNoOptions.value = await queryNoOptions('innerNo', value); | |
66 | + }, | |
67 | + }, | |
68 | + }, | |
69 | +] | |
7 | 70 | // export const COLUMNS = [ |
8 | 71 | // { |
9 | 72 | // title: '客户编码', | ... | ... |
src/views/project/finance/financeProfit/ServiceProfit/PackageProfit/tableData.tsx
... | ... | @@ -21,74 +21,11 @@ const orderStore = useOrderStoreWithOut(); |
21 | 21 | // 基本信息 |
22 | 22 | export const FIELDS_BASE_INFO = [ |
23 | 23 | { |
24 | - field: 'customerCode', | |
24 | + field: 'packetActualRmbTotalPrice', | |
25 | 25 | component: 'Select', |
26 | 26 | labelWidth: 150, |
27 | - label: '客户编码', | |
27 | + label: '包装费用实际金额¥', | |
28 | 28 | rules: [{ required: true }], |
29 | 29 | }, |
30 | - { | |
31 | - field: 'projectNo', | |
32 | - component: 'Input', | |
33 | - labelWidth: 150, | |
34 | - label: '项目号', | |
35 | - rules: [{ required: true }], | |
36 | - }, | |
37 | - { | |
38 | - field: 'productionDepartment', | |
39 | - component: 'Select', | |
40 | - // componentProps: { | |
41 | - // options: productionDepartmentOptions, | |
42 | - // }, | |
43 | - labelWidth: 150, | |
44 | - label: '生产科', | |
45 | - rules: [{ required: true }], | |
46 | - }, | |
47 | - | |
48 | - { | |
49 | - field: 'innerNo', | |
50 | - component: 'Input', | |
51 | - labelWidth: 150, | |
52 | - label: '内部编号', | |
53 | - rules: [ | |
54 | - { required: true }, | |
55 | - { | |
56 | - validator: async (rule, value) => { | |
57 | - if (value.includes(' ')) { | |
58 | - return Promise.reject(); | |
59 | - } | |
60 | - return Promise.resolve(); | |
61 | - }, | |
62 | - message: '内容存在空格,请检查', | |
63 | - trigger: ['change', 'blur'], | |
64 | - }, | |
65 | - ], | |
66 | - }, | |
67 | - { | |
68 | - field: 'customerPo', | |
69 | - component: 'Input', | |
70 | - labelWidth: 150, | |
71 | - label: '客户po号', | |
72 | - rules: [{ required: true }], | |
73 | - }, | |
74 | - { | |
75 | - field: 'customerStyle', | |
76 | - component: 'Input', | |
77 | - labelWidth: 150, | |
78 | - label: '客户STYLE', | |
79 | - rules: [ | |
80 | - { required: true }, | |
81 | - { | |
82 | - validator: async (rule, value) => { | |
83 | - if (value.includes(' ')) { | |
84 | - return Promise.reject(); | |
85 | - } | |
86 | - return Promise.resolve(); | |
87 | - }, | |
88 | - message: '内容存在空格,请检查', | |
89 | - trigger: ['change', 'blur'], | |
90 | - }, | |
91 | - ], | |
92 | - }, | |
93 | 30 | ]; |
94 | 31 | ... | ... |
src/views/project/finance/financeProfit/ServiceProfit/ServiceProfit/ApproveReason.vue
0 → 100644
1 | +<template> | |
2 | + <BasicModal | |
3 | + v-bind="$attrs" | |
4 | + destroyOnClose | |
5 | + @register="register" | |
6 | + title="申请原因" | |
7 | + :helpMessage="['提示1', '提示2']" | |
8 | + @open-change="handleShow" | |
9 | + :bodyStyle="{ height: '200px' }" | |
10 | + @ok="handleOk" | |
11 | + z-index="9999" | |
12 | + > | |
13 | + <a-textarea v-model:value="input" :rows="7" /> | |
14 | + </BasicModal> | |
15 | +</template> | |
16 | +<script lang="ts" setup> | |
17 | + import { ref, watch } from 'vue'; | |
18 | + import { BasicModal, useModalInner } from '@/components/Modal'; | |
19 | + import { orderAuth } from '/@/api/project/order'; | |
20 | + import { getServiceApplyEdit } from '/@/api/project/invoice'; | |
21 | + | |
22 | + const emit = defineEmits(['success']); | |
23 | + const input = ref(''); | |
24 | + const baseFieldValues = ref(); | |
25 | + const [register, { setModalProps, redoModalHeight, closeModal }] = useModalInner(async (data) => { | |
26 | + baseFieldValues.value = data.data; | |
27 | + baseFieldValues.value.projectNoPrefix = data.id; | |
28 | + }); | |
29 | + async function handleOk() { | |
30 | + baseFieldValues.value.applyRemark = input.value; | |
31 | + await getServiceApplyEdit({ | |
32 | + projectNoPrefix: baseFieldValues.value.projectNoPrefix, | |
33 | + actualExchangeRate: baseFieldValues.value.actualExchangeRate, | |
34 | + developmentCopyRmbTotalPrice: baseFieldValues.value.developmentCopyRmbTotalPrice, | |
35 | + paidRmbCommission: baseFieldValues.value.paidRmbCommission, | |
36 | + projectStartTime: baseFieldValues.value.projectStartTime, | |
37 | + projectEndTime: baseFieldValues.value.projectEndTime, | |
38 | + spainPaidRmbCommission: baseFieldValues.value.spainPaidRmbCommission, | |
39 | + applyRemark: baseFieldValues.value.applyRemark, | |
40 | + }); | |
41 | + emit('success'); | |
42 | + setTimeout(() => { | |
43 | + closeModal(); | |
44 | + }, 50); | |
45 | + } | |
46 | + function handleShow() { | |
47 | + input.value = ''; | |
48 | + closeModal(); | |
49 | + } | |
50 | +</script> | ... | ... |
src/views/project/finance/financeProfit/ServiceProfit/ServiceProfit/CheckDetail.vue
... | ... | @@ -13,8 +13,7 @@ |
13 | 13 | okText="申请" |
14 | 14 | ><input /> |
15 | 15 | <div> |
16 | - <template v-if="role === ROLE.ADMIN || role === ROLE.TRACKER"> | |
17 | - <h3>基本信息</h3> | |
16 | + <template v-if="role === ROLE.ADMIN || role === ROLE.FINANCE"> | |
18 | 17 | <BasicForm @register="registerForm" /> |
19 | 18 | </template> |
20 | 19 | </div> |
... | ... | @@ -24,43 +23,38 @@ |
24 | 23 | <a-button type="primary" @click="onGoFormDetail"> 返回编辑</a-button> |
25 | 24 | </template> --> |
26 | 25 | </BasicDrawer> |
26 | + <ApproveReason @register="approveReasonRegister" @success="handleCloseModal" /> | |
27 | 27 | </div> |
28 | 28 | </template> |
29 | 29 | <script lang="ts"> |
30 | 30 | import { computed, defineComponent, reactive, ref } from 'vue'; |
31 | 31 | import { BasicForm, useForm } from '/@/components/Form/index'; |
32 | - import { orderAuth } from '/@/api/project/order'; | |
32 | + import { getServiceApplyEdit } from '/@/api/project/invoice'; | |
33 | 33 | import { ROLE } from '../../../financeList/type.d'; |
34 | 34 | import { useModal } from '/@/components/Modal'; |
35 | - | |
35 | + import ApproveReason from './ApproveReason.vue'; | |
36 | 36 | import { BasicDrawer, useDrawerInner } from '/@/components/Drawer'; |
37 | 37 | import { FIELDS_BASE_INFO } from './tableData'; |
38 | 38 | import { useUserStoreWithOut } from '/@/store/modules/user'; |
39 | 39 | |
40 | 40 | const userStore = useUserStoreWithOut(); |
41 | 41 | const getSchema = (fields) => |
42 | - fields | |
43 | - .map((item) => ({ | |
44 | - field: `${item.field}`, | |
45 | - dataIndex: `${item.field}`, | |
46 | - label: item.label, | |
47 | - component: 'Switch', | |
48 | - componentProps: { | |
49 | - checkedValue: 'UN_LOCKED', | |
50 | - unCheckedValue: 'LOCKED', | |
51 | - }, | |
52 | - colProps: { | |
53 | - span: 6, | |
54 | - }, | |
55 | - })) | |
56 | - .filter( | |
57 | - (item) => | |
58 | - // item.field !== 'packetPrice' && | |
59 | - item.field !== 'exchangeRate' && item.field !== 'profitRate', | |
60 | - ); | |
42 | + fields.map((item) => ({ | |
43 | + field: `${item.field}`, | |
44 | + dataIndex: `${item.field}`, | |
45 | + label: item.label, | |
46 | + component: 'Switch', | |
47 | + componentProps: { | |
48 | + checkedValue: 'UN_LOCKED', | |
49 | + unCheckedValue: 'LOCKED', | |
50 | + }, | |
51 | + colProps: { | |
52 | + span: 8, | |
53 | + }, | |
54 | + })); | |
61 | 55 | |
62 | 56 | export default defineComponent({ |
63 | - components: { BasicDrawer, BasicForm }, | |
57 | + components: { BasicDrawer, BasicForm, ApproveReason }, | |
64 | 58 | props: { |
65 | 59 | onGoFormDetail: { |
66 | 60 | type: Function, |
... | ... | @@ -70,17 +64,20 @@ |
70 | 64 | const id = ref(''); |
71 | 65 | const schemas = getSchema(FIELDS_BASE_INFO); |
72 | 66 | const [registerForm, { getFieldsValue }] = useForm({ |
73 | - labelWidth: 120, | |
67 | + labelWidth: 180, | |
74 | 68 | schemas, |
75 | 69 | showActionButtonGroup: false, |
76 | 70 | actionColOptions: { |
77 | 71 | span: 24, |
78 | 72 | }, |
79 | 73 | }); |
74 | + const [approveReasonRegister, { openModal: openApproveReasonDrawer }] = useModal(); | |
75 | + | |
80 | 76 | const lockFields = reactive({}); |
81 | 77 | const [register, { closeDrawer }] = useDrawerInner((data) => { |
78 | + console.log(data, '5656datach'); | |
82 | 79 | Object.assign(lockFields, data.lockFields); |
83 | - id.value = data.id; | |
80 | + id.value = data.projectNoPrefix; | |
84 | 81 | }); |
85 | 82 | function handleCloseModal() { |
86 | 83 | closeDrawer(); |
... | ... | @@ -92,32 +89,37 @@ |
92 | 89 | |
93 | 90 | const handleSubmit = async () => { |
94 | 91 | const baseFieldValues = getFieldsValue(); |
92 | + openApproveReasonDrawer(true, { | |
93 | + data: baseFieldValues, | |
94 | + id: id.value, | |
95 | + }); | |
96 | + console.log(baseFieldValues, '5656baseFieldValues'); | |
97 | + // await getServiceApplyEdit({ | |
98 | + // projectNoPrefix: id.value, | |
99 | + // actualExchangeRate: baseFieldValues.actualExchangeRate, | |
100 | + // developmentCopyRmbTotalPrice: baseFieldValues.developmentCopyRmbTotalPrice, | |
101 | + // paidRmbCommission: baseFieldValues.paidRmbCommission, | |
102 | + // projectStartTime: baseFieldValues.projectStartTime, | |
103 | + // projectEndTime: baseFieldValues.projectEndTime, | |
104 | + // spainPaidRmbCommission: baseFieldValues.spainPaidRmbCommission, | |
105 | + // }); | |
106 | + // if (baseFieldValues) { | |
107 | + // FIELDS_BASE_INFO.map( | |
108 | + // ({ field }) => | |
109 | + // (baseFieldValues[field] = | |
110 | + // baseFieldValues[field] === 'UN_LOCKED' ? 'UN_LOCKED' : 'LOCKED'), | |
111 | + // ); | |
112 | + // } | |
113 | + // const values = Object.assign({ orderId: id.value }, { baseFields: baseFieldValues }); | |
95 | 114 | |
96 | - if (baseFieldValues) { | |
97 | - FIELDS_BASE_INFO.map( | |
98 | - ({ field }) => | |
99 | - (baseFieldValues[field] = | |
100 | - baseFieldValues[field] === 'UN_LOCKED' ? 'UN_LOCKED' : 'LOCKED'), | |
101 | - ); | |
102 | - } | |
103 | - const values = Object.assign({ orderId: id.value }, { baseFields: baseFieldValues }); | |
115 | + // if (values.baseFields && values.baseFields.packetActualRmbTotalPrice === 'UN_LOCKED') { | |
116 | + // console.log(values, '5656values1'); | |
117 | + // } else { | |
118 | + // // await orderAuth(values); | |
119 | + // console.log(values, '5656values2'); | |
104 | 120 | |
105 | - if ( | |
106 | - values.baseFields && | |
107 | - (values.baseFields.projectNo === 'UN_LOCKED' || | |
108 | - values.baseFields.productionDepartment === 'UN_LOCKED' || | |
109 | - values.baseFields.innerNo === 'UN_LOCKED' || | |
110 | - values.baseFields.customerCode === 'UN_LOCKED' || | |
111 | - values.baseFields.customerPo === 'UN_LOCKED' || | |
112 | - values.baseFields.customerStyle === 'UN_LOCKED') | |
113 | - ) { | |
114 | - openReasonModal(true, { | |
115 | - data: values, | |
116 | - }); | |
117 | - } else { | |
118 | - await orderAuth(values); | |
119 | - closeDrawer(); | |
120 | - } | |
121 | + // closeDrawer(); | |
122 | + // } | |
121 | 123 | }; |
122 | 124 | |
123 | 125 | return { |
... | ... | @@ -126,6 +128,8 @@ |
126 | 128 | registerForm, |
127 | 129 | handleSubmit, |
128 | 130 | handleCloseModal, |
131 | + approveReasonRegister, | |
132 | + openApproveReasonDrawer, | |
129 | 133 | ROLE, |
130 | 134 | role, |
131 | 135 | }; | ... | ... |
src/views/project/finance/financeProfit/ServiceProfit/ServiceProfit/data.tsx
... | ... | @@ -4,6 +4,9 @@ import { func } from 'vue-types'; |
4 | 4 | import { h, ref } from 'vue'; |
5 | 5 | import { FilePptOutlined } from '@ant-design/icons-vue'; |
6 | 6 | import axios from 'axios'; |
7 | +import { queryNoOptions } from '/@/api/project/order'; | |
8 | +import { useOrderStoreWithOut } from '/@/store/modules/order'; | |
9 | +import { useOrderInfo } from '/@/hooks/component/order'; | |
7 | 10 | |
8 | 11 | // export const COLUMNS = [ |
9 | 12 | // { |
... | ... | @@ -20,6 +23,73 @@ import axios from 'axios'; |
20 | 23 | // scopedSlots: { customRender: 'name' } |
21 | 24 | // }, |
22 | 25 | // ]; |
26 | +const innerNoOptions = ref([]); | |
27 | +const projectNoOptions = ref([]); | |
28 | +const orderStore = useOrderStoreWithOut(); | |
29 | +const { | |
30 | + customerCode, | |
31 | + productionDepartment, | |
32 | +} = useOrderInfo(orderStore); | |
33 | +export const searchFormSchema = [ | |
34 | + { | |
35 | + field: 'customerCode', | |
36 | + label: '客户编码', | |
37 | + component: 'Select', | |
38 | + colProps: { span: 8 }, | |
39 | + | |
40 | + componentProps: { | |
41 | + options: customerCode, | |
42 | + showSearch: true, | |
43 | + mode: 'multiple', | |
44 | + }, | |
45 | + }, | |
46 | + { | |
47 | + field: 'projectNo', | |
48 | + label: '项目号', | |
49 | + component: 'Select', | |
50 | + colProps: { span: 8 }, | |
51 | + | |
52 | + componentProps: { | |
53 | + options: projectNoOptions, | |
54 | + showSearch: true, | |
55 | + mode: 'multiple', | |
56 | + onSearch: async (value: any) => { | |
57 | + projectNoOptions.value = await queryNoOptions('projectNo', value); | |
58 | + }, | |
59 | + // onSearch: async (value: any) => { | |
60 | + // projectNoOptions.value = await queryNoOptions('projectNo', value); | |
61 | + // }, | |
62 | + }, | |
63 | + }, | |
64 | + { | |
65 | + field: 'productionDepartment', | |
66 | + label: '生产科', | |
67 | + component: 'Select', | |
68 | + colProps: { span: 8 }, | |
69 | + | |
70 | + componentProps: { | |
71 | + mode: 'multiple', | |
72 | + | |
73 | + options: productionDepartment, | |
74 | + showSearch: true, | |
75 | + }, | |
76 | + }, | |
77 | + { | |
78 | + field: 'innerNo', | |
79 | + label: '内部编号', | |
80 | + component: 'Select', | |
81 | + colProps: { span: 8 }, | |
82 | + | |
83 | + componentProps: { | |
84 | + options: innerNoOptions, | |
85 | + showSearch: true, | |
86 | + mode: 'multiple', | |
87 | + onSearch: async (value: any) => { | |
88 | + innerNoOptions.value = await queryNoOptions('innerNo', value); | |
89 | + }, | |
90 | + }, | |
91 | + }, | |
92 | +] | |
23 | 93 | export const COLUMNS = [ |
24 | 94 | { |
25 | 95 | title: '客户编码', | ... | ... |
src/views/project/finance/financeProfit/ServiceProfit/ServiceProfit/index.vue
... | ... | @@ -36,17 +36,19 @@ |
36 | 36 | <script setup lang="ts"> |
37 | 37 | import { BasicTable, useTable, TableAction } from '/@/components/Table'; |
38 | 38 | import { getServiceProfit } from '@/api/project/invoice'; |
39 | - import { COLUMNS } from './data'; | |
39 | + import { searchFormSchema, COLUMNS } from './data'; | |
40 | 40 | import { BasicModal, useModal } from '/@/components/Modal'; |
41 | 41 | import { useMessage } from '/@/hooks/web/useMessage'; |
42 | - import { ref } from 'vue'; | |
42 | + import { onMounted, ref } from 'vue'; | |
43 | 43 | import { useDrawer } from '/@/components/Drawer'; |
44 | 44 | import FinanceEdit from './FinanceEdit.vue'; |
45 | 45 | import CheckDetail from './CheckDetail.vue'; |
46 | + import { useOrderStoreWithOut } from '/@/store/modules/order'; | |
46 | 47 | |
47 | 48 | const { createMessage } = useMessage(); |
48 | 49 | const { error } = createMessage; |
49 | 50 | const message = ref(); |
51 | + const orderStore = useOrderStoreWithOut(); | |
50 | 52 | const [checkModalRegister, { openDrawer: openCheckDetailDrawer }] = useDrawer(); |
51 | 53 | const [registerFinanceEdit, { openDrawer: openFinanceEdit }] = useDrawer(); |
52 | 54 | // const handleOk = (record) => { |
... | ... | @@ -63,8 +65,19 @@ |
63 | 65 | api: getServiceProfit, |
64 | 66 | bordered: true, |
65 | 67 | columns: COLUMNS, |
68 | + clickToRowSelect: false, | |
66 | 69 | rowKey: 'id', |
70 | + formConfig: { | |
71 | + labelWidth: 120, | |
72 | + schemas: searchFormSchema, | |
73 | + autoSubmitOnEnter: true, | |
74 | + }, | |
67 | 75 | useSearchForm: true, |
76 | + showTableSetting: true, | |
77 | + showIndexColumn: false, | |
78 | + tableSetting: { | |
79 | + setting: false, | |
80 | + }, | |
68 | 81 | actionColumn: { |
69 | 82 | width: 240, |
70 | 83 | title: 'Action', |
... | ... | @@ -115,6 +128,10 @@ |
115 | 128 | ]; |
116 | 129 | } |
117 | 130 | |
131 | + onMounted(async () => { | |
132 | + await orderStore.getDict(); | |
133 | + }); | |
134 | + | |
118 | 135 | function handleFinanceEdit(record) { |
119 | 136 | console.log(record, '5656reer'); |
120 | 137 | openFinanceEdit(true, { | ... | ... |
src/views/project/finance/financeProfit/ServiceProfit/ServiceProfit/tableData.tsx
... | ... | @@ -21,74 +21,46 @@ const orderStore = useOrderStoreWithOut(); |
21 | 21 | // 基本信息 |
22 | 22 | export const FIELDS_BASE_INFO = [ |
23 | 23 | { |
24 | - field: 'customerCode', | |
24 | + field: 'developmentCopyRmbTotalPrice', | |
25 | 25 | component: 'Select', |
26 | 26 | labelWidth: 150, |
27 | - label: '客户编码', | |
27 | + label: '研发复制费合计¥', | |
28 | 28 | rules: [{ required: true }], |
29 | 29 | }, |
30 | 30 | { |
31 | - field: 'projectNo', | |
32 | - component: 'Input', | |
31 | + field: 'projectStartTime', | |
32 | + component: 'Select', | |
33 | 33 | labelWidth: 150, |
34 | - label: '项目号', | |
34 | + label: '项目开始时间', | |
35 | 35 | rules: [{ required: true }], |
36 | 36 | }, |
37 | 37 | { |
38 | - field: 'productionDepartment', | |
38 | + field: 'projectEndTime', | |
39 | 39 | component: 'Select', |
40 | - // componentProps: { | |
41 | - // options: productionDepartmentOptions, | |
42 | - // }, | |
43 | 40 | labelWidth: 150, |
44 | - label: '生产科', | |
41 | + label: '项目结束时间', | |
45 | 42 | rules: [{ required: true }], |
46 | 43 | }, |
47 | - | |
48 | 44 | { |
49 | - field: 'innerNo', | |
50 | - component: 'Input', | |
45 | + field: 'spainPaidRmbCommission', | |
46 | + component: 'Select', | |
51 | 47 | labelWidth: 150, |
52 | - label: '内部编号', | |
53 | - rules: [ | |
54 | - { required: true }, | |
55 | - { | |
56 | - validator: async (rule, value) => { | |
57 | - if (value.includes(' ')) { | |
58 | - return Promise.reject(); | |
59 | - } | |
60 | - return Promise.resolve(); | |
61 | - }, | |
62 | - message: '内容存在空格,请检查', | |
63 | - trigger: ['change', 'blur'], | |
64 | - }, | |
65 | - ], | |
48 | + label: '西班牙已发提成¥', | |
49 | + rules: [{ required: true }], | |
66 | 50 | }, |
67 | 51 | { |
68 | - field: 'customerPo', | |
69 | - component: 'Input', | |
52 | + field: 'paidRmbCommission', | |
53 | + component: 'Select', | |
70 | 54 | labelWidth: 150, |
71 | - label: '客户po号', | |
55 | + label: '中国团队已发提成¥', | |
72 | 56 | rules: [{ required: true }], |
73 | 57 | }, |
74 | 58 | { |
75 | - field: 'customerStyle', | |
76 | - component: 'Input', | |
59 | + field: 'actualExchangeRate', | |
60 | + component: 'Select', | |
77 | 61 | labelWidth: 150, |
78 | - label: '客户STYLE', | |
79 | - rules: [ | |
80 | - { required: true }, | |
81 | - { | |
82 | - validator: async (rule, value) => { | |
83 | - if (value.includes(' ')) { | |
84 | - return Promise.reject(); | |
85 | - } | |
86 | - return Promise.resolve(); | |
87 | - }, | |
88 | - message: '内容存在空格,请检查', | |
89 | - trigger: ['change', 'blur'], | |
90 | - }, | |
91 | - ], | |
62 | + label: '实际汇率¥', | |
63 | + rules: [{ required: true }], | |
92 | 64 | }, |
93 | 65 | ]; |
94 | 66 | ... | ... |