Commit 7311d332de5958bbc32c2e6a3c54567e0a52832a
1 parent
8ef6b19d
feat: add new column
Showing
10 changed files
with
258 additions
and
101 deletions
src/api/project/order.ts
... | ... | @@ -14,6 +14,7 @@ enum Api { |
14 | 14 | QUERY_PROJECT_NO_AND_INNER_NO = '/order/erp/order/queryProjectNoAndInnerNo', //查询项目号和内部编号 |
15 | 15 | EXPORT = '/order/erp/order/export', |
16 | 16 | UPLOAD = '/api/localStorage/uploadOss', |
17 | + PROFIT_RATE = '/order/erp/profit/calculate', // 编辑订单实时获取利润率 | |
17 | 18 | |
18 | 19 | DICT_INIT = '/order/erp/dictionary/get_all', |
19 | 20 | DICT_ADD = '/order/erp/dictionary/add', |
... | ... | @@ -63,6 +64,10 @@ export const orderCreate = async (data: any) => { |
63 | 64 | return res; |
64 | 65 | }; |
65 | 66 | |
67 | +export const getOrderProfitRate = async (data: any) => { | |
68 | + return defHttp.post<any>({ url: Api.PROFIT_RATE, data }); | |
69 | +}; | |
70 | + | |
66 | 71 | export const queryProjectNoAndInnerNo = async (data: any) => { |
67 | 72 | const res = await defHttp.post<any>({ url: Api.QUERY_PROJECT_NO_AND_INNER_NO, data }); |
68 | 73 | return res; | ... | ... |
src/utils/project.ts
1 | 1 | export const getDisable = (code, id, value) => { |
2 | - return code === 'LOCKED' && !!id && value; | |
2 | + return code === 'LOCKED' && !!id && (value || value === 0); | |
3 | 3 | }; |
4 | 4 | |
5 | 5 | // 利润分析的权限校验 |
6 | 6 | export const getProfitDisable = (field, code, id, value) => { |
7 | 7 | // 包装费用,汇率不允许修改 |
8 | - if (['packetPrice', 'exchangeRate'].includes(field)) { | |
8 | + if (['packetPrice', 'exchangeRate', 'profitRate'].includes(field)) { | |
9 | 9 | return true; |
10 | 10 | } |
11 | 11 | // code是lock,编辑并且value存在,才需要审核 |
12 | - return code === 'LOCKED' && !!id && value; | |
12 | + return code === 'LOCKED' && !!id && (value || value === 0); | |
13 | 13 | }; |
14 | 14 | |
15 | 15 | // 基本信息的权限校验 客户编码、项目号、生产科、内部编号、业务员 才需要审核 | ... | ... |
src/views/project/approve/ProfitPanel.vue
... | ... | @@ -141,16 +141,17 @@ |
141 | 141 | openDrawer(true, { data }); |
142 | 142 | id.value = data.id; |
143 | 143 | fieldInfos.value = (FIELDS_PROFIT_INFO as any) |
144 | - .concat({ | |
145 | - label: '利润率', | |
146 | - field: 'profitRate', | |
147 | - }) | |
148 | 144 | .map((field) => { |
149 | 145 | if (field.field === 'profitType') { |
150 | 146 | return { |
151 | 147 | label: field.label, |
152 | 148 | value: data.fieldInfos.profitAnalysisFields[field.field] == 0 ? '方式1' : '方式2', |
153 | 149 | }; |
150 | + } else if (field.field === 'profitRate') { | |
151 | + return { | |
152 | + label: field.label, | |
153 | + value: (data.fieldInfos.profitAnalysisFields[field.field] * 100).toFixed(2) + '%', | |
154 | + }; | |
154 | 155 | } |
155 | 156 | return { |
156 | 157 | label: field.label, | ... | ... |
src/views/project/order/CheckDetail.vue
... | ... | @@ -72,7 +72,12 @@ |
72 | 72 | span: 6, |
73 | 73 | }, |
74 | 74 | })) |
75 | - .filter((item) => item.field !== 'packetPrice' && item.field !== 'exchangeRate'); | |
75 | + .filter( | |
76 | + (item) => | |
77 | + item.field !== 'packetPrice' && | |
78 | + item.field !== 'exchangeRate' && | |
79 | + item.field !== 'profitRate', | |
80 | + ); | |
76 | 81 | |
77 | 82 | export default defineComponent({ |
78 | 83 | components: { BasicDrawer, BasicForm }, | ... | ... |
src/views/project/order/ExportModal.vue
... | ... | @@ -3,7 +3,7 @@ |
3 | 3 | v-bind="$attrs" |
4 | 4 | destroyOnClose |
5 | 5 | @register="register" |
6 | - title="利润分析表" | |
6 | + title="导出" | |
7 | 7 | width="500px" |
8 | 8 | :height="100" |
9 | 9 | wrapClassName="h-[260px]" |
... | ... | @@ -12,7 +12,7 @@ |
12 | 12 | > |
13 | 13 | <CheckboxGroup v-model:value="checkedList" :options="options" /> |
14 | 14 | <div className="mt-6"> |
15 | - <a-button type="primary" @click="handleCalc" className="ml-4">导出</a-button> | |
15 | + <a-button type="primary" @click="handleExport" className="ml-4">导出</a-button> | |
16 | 16 | </div> |
17 | 17 | </BasicModal> |
18 | 18 | </template> |
... | ... | @@ -92,7 +92,7 @@ |
92 | 92 | } |
93 | 93 | } |
94 | 94 | |
95 | - async function handleCalc() { | |
95 | + async function handleExport() { | |
96 | 96 | const fieldVO: any = {}; |
97 | 97 | checkedList.value.forEach((item) => { |
98 | 98 | if (item === 'baseFields') { |
... | ... | @@ -108,8 +108,13 @@ |
108 | 108 | } else if (item === 'profitAnalysisFields') { |
109 | 109 | if (props.role === ROLE.TRACKER) { |
110 | 110 | fieldVO.profitAnalysisFields = ORDER_LIST_PROFIT_FIELDS[0].children |
111 | - .filter( | |
112 | - (k) => k.dataIndex === 'customerPrice' || k.dataIndex === 'customerTotalPrice', | |
111 | + .filter((k) => | |
112 | + [ | |
113 | + 'customerPrice', | |
114 | + 'customerRmbPrice', | |
115 | + 'customerTotalPrice', | |
116 | + 'customerRmbTotalPrice', | |
117 | + ].includes(k.dataIndex), | |
113 | 118 | ) |
114 | 119 | .map((item) => ({ |
115 | 120 | [item.dataIndex]: 'selected', |
... | ... | @@ -144,7 +149,7 @@ |
144 | 149 | handleShow, |
145 | 150 | info, |
146 | 151 | manualPreform, |
147 | - handleCalc, | |
152 | + handleExport, | |
148 | 153 | activeUser, |
149 | 154 | exchangeRate, |
150 | 155 | checkedList, | ... | ... |
src/views/project/order/FormDetail/ProfitFormPanel.vue
... | ... | @@ -2,13 +2,15 @@ |
2 | 2 | <BasicForm @register="registerForm" /> |
3 | 3 | </template> |
4 | 4 | <script lang="ts"> |
5 | - import { computed, defineComponent, reactive, ref, toRaw } from 'vue'; | |
5 | + import { computed, defineComponent, reactive, ref, nextTick } from 'vue'; | |
6 | 6 | import { BasicForm, useForm } from '/@/components/Form/index'; |
7 | 7 | import { FIELDS_PROFIT_INFO } from '../tableData'; |
8 | 8 | import { getProfitDisable } from '/@/utils/project'; |
9 | - import { get } from 'lodash-es'; | |
9 | + import { debounce, get } from 'lodash-es'; | |
10 | 10 | import { useOrderInfo } from '/@/hooks/component/order'; |
11 | 11 | import { useOrderStoreWithOut } from '/@/store/modules/order'; |
12 | + import message from '/@/views/form-design/utils/message'; | |
13 | + import { getOrderProfitRate } from '/@/api/project/order'; | |
12 | 14 | |
13 | 15 | export default defineComponent({ |
14 | 16 | components: { BasicForm }, |
... | ... | @@ -23,6 +25,10 @@ |
23 | 25 | profitFormData: { |
24 | 26 | type: Object, |
25 | 27 | }, |
28 | + orderCount: { | |
29 | + type: Number, | |
30 | + default: 0, | |
31 | + }, | |
26 | 32 | }, |
27 | 33 | emits: ['success'], |
28 | 34 | setup(props, { emit }) { |
... | ... | @@ -30,6 +36,43 @@ |
30 | 36 | const orderStore = useOrderStoreWithOut(); |
31 | 37 | |
32 | 38 | const { exchangeRate } = useOrderInfo(orderStore); |
39 | + const updateProfitRate = debounce(async (field) => { | |
40 | + const values = getFieldsValue(); | |
41 | + const { | |
42 | + profitType, | |
43 | + packetPrice, | |
44 | + exchangeRate = 0, | |
45 | + customerPrice, | |
46 | + customerRmbPrice, | |
47 | + productionDepartmentPrice, | |
48 | + profitRate, | |
49 | + } = values; | |
50 | + if (customerPrice && exchangeRate && packetPrice && customerRmbPrice) { | |
51 | + const customerTotalPrice = (customerPrice * (props.orderCount || 0)).toFixed(2); // 客户总价,美元 | |
52 | + const productionDepartmentTotalPrice = ( | |
53 | + productionDepartmentPrice * (props.orderCount || 0) | |
54 | + ).toFixed(2); // 生成科总价¥ | |
55 | + const packetTotalPrice = (packetPrice * (props.orderCount || 0)).toFixed(2); // 包装费用总价 | |
56 | + if ( | |
57 | + customerPrice && | |
58 | + customerRmbPrice && | |
59 | + productionDepartmentPrice && | |
60 | + // 只修改单价和部门才会计算利润率 | |
61 | + ['customerPrice', 'customerRmbPrice', 'productionDepartmentPrice'].includes(field) | |
62 | + ) { | |
63 | + const res = await getOrderProfitRate({ | |
64 | + profitType: profitType || '0', | |
65 | + packetTotalPrice, | |
66 | + productionDepartmentTotalPrice, | |
67 | + customerTotalPrice, | |
68 | + exchangeRate, | |
69 | + }); | |
70 | + if (profitRate !== (res * 100).toFixed(2)) { | |
71 | + setFieldsValue({ profitRate: (res * 100).toFixed(2) + '%' }); | |
72 | + } | |
73 | + } | |
74 | + } | |
75 | + }, 300); | |
33 | 76 | |
34 | 77 | const schemas = computed(() => { |
35 | 78 | const options = { |
... | ... | @@ -51,6 +94,29 @@ |
51 | 94 | props.id, |
52 | 95 | get(props.profitFormData, `${item.field}`), |
53 | 96 | ), |
97 | + onChange: async (val) => { | |
98 | + const values = getFieldsValue(); | |
99 | + const { exchangeRate = 0, customerPrice, customerRmbPrice } = values || {}; | |
100 | + // 修改的客户单价 | |
101 | + if (item.field === 'customerPrice' && val !== customerPrice) { | |
102 | + if (exchangeRate !== 0) { | |
103 | + await setFieldsValue({ customerRmbPrice: val * exchangeRate }); | |
104 | + } else { | |
105 | + message.error('汇率等于0,美元人民币之间无法转换'); | |
106 | + } | |
107 | + } | |
108 | + // 值不相等才变化,不然无限循环了 | |
109 | + if (item.field === 'customerRmbPrice' && val !== customerRmbPrice) { | |
110 | + if (exchangeRate !== 0) { | |
111 | + await setFieldsValue({ customerPrice: val / exchangeRate }); | |
112 | + } else { | |
113 | + message.error('汇率等于0,美元人民币之间无法转换'); | |
114 | + } | |
115 | + } | |
116 | + nextTick(() => { | |
117 | + updateProfitRate(item.field); | |
118 | + }); | |
119 | + }, | |
54 | 120 | }, |
55 | 121 | colProps: { |
56 | 122 | span: 24, |
... | ... | @@ -81,4 +147,3 @@ |
81 | 147 | }, |
82 | 148 | }); |
83 | 149 | </script> |
84 | -../constant | ... | ... |
src/views/project/order/FormDetail/index.vue
... | ... | @@ -33,7 +33,12 @@ |
33 | 33 | > |
34 | 34 | <span className="text-red-600">{{ checkingMsg }}</span> |
35 | 35 | |
36 | - <ProfitFormPanel ref="profitFormPanelRef" :id="id" :profitFormData="profitFormData" /> | |
36 | + <ProfitFormPanel | |
37 | + ref="profitFormPanelRef" | |
38 | + :orderCount="orderCount" | |
39 | + :id="id" | |
40 | + :profitFormData="profitFormData" | |
41 | + /> | |
37 | 42 | </TabPanel> |
38 | 43 | <TabPanel |
39 | 44 | key="3" |
... | ... | @@ -131,6 +136,7 @@ |
131 | 136 | const reportFormPanelRef = ref(); |
132 | 137 | const trackFormPanelRef = ref(); |
133 | 138 | const inspectionFormPanelRef = ref(); |
139 | + const orderCount = ref(0); | |
134 | 140 | |
135 | 141 | // 编辑从接口获取的value |
136 | 142 | const baseFormData = ref(); |
... | ... | @@ -187,9 +193,10 @@ |
187 | 193 | return; |
188 | 194 | } |
189 | 195 | id.value = data.id; |
190 | - profitFormData.value = data.profitAnalysisInfo; | |
196 | + profitFormData.value = | |
197 | + data?.orderUpdateInfoVO?.profitAnalysisFields || data.profitAnalysisInfo; | |
191 | 198 | inspectFormData.value = data.inspectionStageInfo; |
192 | - reportFormData.value = data.reportInfo; | |
199 | + reportFormData.value = data?.orderUpdateInfoVO?.reportFields || data.reportInfo; | |
193 | 200 | trackFormData.value = data.trackStageInfo; |
194 | 201 | |
195 | 202 | // 方式1 |
... | ... | @@ -205,6 +212,8 @@ |
205 | 212 | }; |
206 | 213 | |
207 | 214 | if (id.value) { |
215 | + orderCount.value = data.orderCount; | |
216 | + | |
208 | 217 | setTimeout(() => { |
209 | 218 | // 基本信息 |
210 | 219 | if (baseFormPanelRef.value) { |
... | ... | @@ -231,7 +240,7 @@ |
231 | 240 | profitFormPanelRef.value.fields = { ...data.lockFields?.profitAnalysisFields } || {}; |
232 | 241 | |
233 | 242 | if (data?.orderUpdateInfoVO?.profitAnalysisFields) { |
234 | - const { customerPrice, productionDepartmentPrice } = | |
243 | + const { customerPrice, productionDepartmentPrice, customerRmbPrice } = | |
235 | 244 | data?.orderUpdateInfoVO?.profitAnalysisFields || {}; |
236 | 245 | |
237 | 246 | //给个审核中提示 |
... | ... | @@ -241,6 +250,7 @@ |
241 | 250 | profitFormPanelRef?.value?.setFieldsValue({ |
242 | 251 | ...toRaw(data?.orderUpdateInfoVO?.profitAnalysisFields), |
243 | 252 | customerPrice: Number(customerPrice || 0), |
253 | + customerRmbPrice: Number(customerRmbPrice || 0), | |
244 | 254 | productionDepartmentPrice: Number(productionDepartmentPrice || 0), |
245 | 255 | packetPrice: packetPrice?.relationValue || 0, |
246 | 256 | exchangeRate: exchangeRate?.settingValue, |
... | ... | @@ -317,14 +327,24 @@ |
317 | 327 | closeDrawer(); |
318 | 328 | emit('success', {}); |
319 | 329 | } else { |
330 | + // 利润分析 | |
320 | 331 | if (activeKey.value === '2') { |
321 | 332 | await profitFormPanelRef?.value?.validate(); |
322 | 333 | forms.profitAnalysisInfo = profitFormPanelRef?.value?.getFieldsValue() || {}; |
334 | + delete forms.profitAnalysisInfo.profitRate; | |
335 | + forms.profitAnalysisInfo.customerRmbPrice = | |
336 | + forms.profitAnalysisInfo.customerRmbPrice.toFixed(2); // 客户单价¥ | |
337 | + forms.profitAnalysisInfo.customerRmbTotalPrice = ( | |
338 | + forms.profitAnalysisInfo.customerRmbPrice * orderCount.value | |
339 | + ).toFixed(2); // 客户总价¥ | |
340 | + forms.profitAnalysisInfo.customerPrice = | |
341 | + forms.profitAnalysisInfo.customerPrice.toFixed(2); // 客户单价$ | |
323 | 342 | // 方式如果没有变化,默认方式1 |
324 | 343 | if (!forms.profitAnalysisInfo.profitType) { |
325 | 344 | forms.profitAnalysisInfo.profitType = '0'; |
326 | 345 | } |
327 | 346 | } else if (activeKey.value === '3') { |
347 | + // 项目报告书 | |
328 | 348 | await reportFormPanelRef?.value?.validate(); |
329 | 349 | // 比重相加等于1 |
330 | 350 | const values = reportFormPanelRef?.value?.getFieldsValue() || {}; |
... | ... | @@ -385,6 +405,7 @@ |
385 | 405 | handleSubmit, |
386 | 406 | businessUsers, |
387 | 407 | checkingMsg, |
408 | + orderCount, | |
388 | 409 | }; |
389 | 410 | }, |
390 | 411 | }); | ... | ... |
src/views/project/order/HistoryDetail.vue
... | ... | @@ -132,13 +132,14 @@ |
132 | 132 | const activeKey = ref(1); |
133 | 133 | |
134 | 134 | const getOrderOptLogFunc = async (data, index, page) => { |
135 | + console.log('%c [ data ]-135', 'font-size:13px; background:pink; color:#bf2c9f;', data); | |
135 | 136 | if (index === 1) { |
136 | - const res = await getOrderOptLog({ orderId: data.id, page: page, pageSize: 20 }); | |
137 | + const res = await getOrderOptLog({ orderId: data, page: page, pageSize: 20 }); | |
137 | 138 | list1.value = res.records; |
138 | 139 | total1.value = res.total; |
139 | 140 | page1.value = page; |
140 | 141 | } else { |
141 | - const res = await getOrderAuditLog({ orderId: data.id, page: page, pageSize: 20 }); | |
142 | + const res = await getOrderAuditLog({ orderId: data, page: page, pageSize: 20 }); | |
142 | 143 | list2.value = res.records; |
143 | 144 | total2.value = res.total; |
144 | 145 | page2.value = page; | ... | ... |
src/views/project/order/ProfitAnalysis.vue
... | ... | @@ -11,10 +11,10 @@ |
11 | 11 | <div className="mb-2"> |
12 | 12 | 公式: |
13 | 13 | <Select |
14 | - className="w-[200px]" | |
14 | + className="w-[240px]" | |
15 | 15 | :options="[ |
16 | - { label: '公式1:1 -(LOCAL总金额 / 汇率 + 包装总金额)/客户总金额', value: '0' }, | |
17 | - { label: '公式2:1 -(LOCAL总金额/汇率 / (客户总金额-包装费用总金额)', value: '1' }, | |
16 | + { label: '公式1:1 -(LOCAL总金额 / 汇率 + 包装总金额)/ 客户总金额', value: '0' }, | |
17 | + { label: '公式2:1 -(LOCAL总金额 / 汇率 / (客户总金额-包装费用总金额)', value: '1' }, | |
18 | 18 | ]" |
19 | 19 | v-model:value="profitType" |
20 | 20 | placeholder="请选择" |
... | ... | @@ -49,7 +49,7 @@ |
49 | 49 | <script lang="ts"> |
50 | 50 | import { computed, defineComponent, onMounted, ref, toRaw, watch } from 'vue'; |
51 | 51 | import { BasicModal, useModalInner } from '/@/components/Modal'; |
52 | - import { Description, DescItem, useDescription } from '/@/components/Description/index'; | |
52 | + import { Description, DescItem } from '/@/components/Description/index'; | |
53 | 53 | import { orderAnalysis } from '/@/api/project/order'; |
54 | 54 | import { Select, Space } from 'ant-design-vue'; |
55 | 55 | import { useOrderStoreWithOut } from '/@/store/modules/order'; |
... | ... | @@ -82,18 +82,18 @@ |
82 | 82 | { |
83 | 83 | field: 'customerTotalPrice', |
84 | 84 | label: '客户总金额', |
85 | - render: (val) => '$ ' + (val || ''), | |
85 | + render: (val) => '$ ' + (val || 0).toFixed(2), | |
86 | 86 | }, |
87 | 87 | { |
88 | 88 | field: 'packetTotalPrice', |
89 | 89 | label: '供应商总价', |
90 | - render: (val) => '¥ ' + (val || ''), | |
90 | + render: (val) => '¥ ' + (val || 0).toFixed(2), | |
91 | 91 | }, |
92 | 92 | { |
93 | 93 | field: 'productionDepartmentTotalPrice', |
94 | 94 | label: '包装费用', |
95 | 95 | show: isTracker, |
96 | - render: (val) => '$' + (val || ''), | |
96 | + render: (val) => '$' + (val || 0).toFixed(2), | |
97 | 97 | }, |
98 | 98 | { |
99 | 99 | field: 'profitRate', | ... | ... |
src/views/project/order/tableData.tsx
... | ... | @@ -224,72 +224,95 @@ export const ORDER_LIST_PROFIT_FIELDS = [ |
224 | 224 | dataIndex: 'profitAnalysisInfo', |
225 | 225 | children: [ |
226 | 226 | { |
227 | - title: '客户单价', | |
227 | + title: '客户单价$', | |
228 | 228 | width: 150, |
229 | 229 | dataIndex: 'customerPrice', |
230 | 230 | customRender: (column) => { |
231 | 231 | const { record } = column || {}; |
232 | - return `${record?.profitAnalysisInfo?.customerCurrency || ''} ${ | |
233 | - record?.profitAnalysisInfo?.customerPrice || '' | |
234 | - }`; | |
232 | + return record?.profitAnalysisInfo?.customerPrice; | |
233 | + // ? `$ ${record?.profitAnalysisInfo?.customerPrice}` | |
234 | + // : ''; | |
235 | 235 | }, |
236 | 236 | }, |
237 | 237 | { |
238 | - title: '客户总价', | |
238 | + title: '客户单价¥', | |
239 | 239 | width: 150, |
240 | - dataIndex: 'customerTotalPrice', | |
240 | + dataIndex: 'customerRmbPrice', | |
241 | 241 | customRender: (column) => { |
242 | 242 | const { record } = column || {}; |
243 | - | |
244 | - return `${record?.profitAnalysisInfo?.customerCurrency || ''} ${ | |
245 | - record?.profitAnalysisInfo?.customerTotalPrice || '' | |
246 | - }`; | |
243 | + return record?.profitAnalysisInfo?.customerRmbPrice; | |
244 | + // ? `¥ ${record?.profitAnalysisInfo?.customerRmbPrice}` | |
245 | + // : ''; | |
247 | 246 | }, |
248 | 247 | }, |
249 | 248 | { |
250 | - title: '生产科单价', | |
249 | + title: '客户总金额$', | |
251 | 250 | width: 150, |
252 | - dataIndex: 'productionDepartmentPrice', | |
251 | + dataIndex: 'customerTotalPrice', | |
253 | 252 | customRender: (column) => { |
254 | 253 | const { record } = column || {}; |
255 | - return `${record?.profitAnalysisInfo?.productionDepartmentCurrency || ''} ${ | |
256 | - record?.profitAnalysisInfo?.productionDepartmentPrice || '' | |
257 | - }`; | |
254 | + | |
255 | + return record?.profitAnalysisInfo?.customerTotalPrice; | |
256 | + // ? `$ ${record?.profitAnalysisInfo?.customerTotalPrice}` | |
257 | + // : ''; | |
258 | 258 | }, |
259 | 259 | }, |
260 | 260 | { |
261 | - title: '生产科总价', | |
261 | + title: '客户总金额¥', | |
262 | 262 | width: 150, |
263 | - dataIndex: 'productionDepartmentTotalPrice', | |
263 | + dataIndex: 'customerRmbTotalPrice', | |
264 | 264 | customRender: (column) => { |
265 | 265 | const { record } = column || {}; |
266 | - return `${record?.profitAnalysisInfo?.productionDepartmentCurrency || ''} ${ | |
267 | - record?.profitAnalysisInfo?.productionDepartmentTotalPrice || '' | |
268 | - }`; | |
266 | + | |
267 | + return record?.profitAnalysisInfo?.customerRmbTotalPrice; | |
268 | + // ? `¥ ${record?.profitAnalysisInfo?.customerRmbTotalPrice}` | |
269 | + // : ''; | |
269 | 270 | }, |
270 | 271 | }, |
271 | 272 | { |
272 | - title: '包装费用', | |
273 | + title: '生产科单价¥', | |
273 | 274 | width: 150, |
274 | - dataIndex: 'packetPrice', | |
275 | + dataIndex: 'productionDepartmentPrice', | |
275 | 276 | customRender: (column) => { |
276 | 277 | const { record } = column || {}; |
277 | - return record?.profitAnalysisInfo?.packetPrice !== undefined | |
278 | - ? `$ ${record?.profitAnalysisInfo?.packetPrice || 0}` | |
279 | - : ''; | |
278 | + return record?.profitAnalysisInfo?.productionDepartmentPrice; | |
279 | + // ? `¥ ${record?.profitAnalysisInfo?.productionDepartmentPrice}` | |
280 | + // : ''; | |
280 | 281 | }, |
281 | 282 | }, |
282 | 283 | { |
283 | - title: '包装费用合计', | |
284 | + title: '生产科总价¥', | |
284 | 285 | width: 150, |
285 | - dataIndex: 'packetTotalPrice', | |
286 | + dataIndex: 'productionDepartmentTotalPrice', | |
286 | 287 | customRender: (column) => { |
287 | 288 | const { record } = column || {}; |
288 | - return record?.profitAnalysisInfo?.packetTotalPrice !== undefined | |
289 | - ? '$ ' + record?.profitAnalysisInfo?.packetTotalPrice | |
290 | - : ''; | |
289 | + return record?.profitAnalysisInfo?.productionDepartmentTotalPrice; | |
290 | + // ? `¥ ${record?.profitAnalysisInfo?.productionDepartmentTotalPrice}` | |
291 | + // : ''; | |
291 | 292 | }, |
292 | 293 | }, |
294 | + // { | |
295 | + // title: '包装费用$', | |
296 | + // width: 150, | |
297 | + // dataIndex: 'packetPrice', | |
298 | + // customRender: (column) => { | |
299 | + // const { record } = column || {}; | |
300 | + // return record?.profitAnalysisInfo?.packetPrice !== undefined; | |
301 | + // // ? `$ ${record?.profitAnalysisInfo?.packetPrice}` | |
302 | + // // : ''; | |
303 | + // }, | |
304 | + // }, | |
305 | + // { | |
306 | + // title: '包装费用合计$', | |
307 | + // width: 150, | |
308 | + // dataIndex: 'packetTotalPrice', | |
309 | + // customRender: (column) => { | |
310 | + // const { record } = column || {}; | |
311 | + // return record?.profitAnalysisInfo?.packetTotalPrice !== undefined; | |
312 | + // // ? '$ ' + record?.profitAnalysisInfo?.packetTotalPrice.toFixed(2) | |
313 | + // // : ''; | |
314 | + // }, | |
315 | + // }, | |
293 | 316 | { |
294 | 317 | title: '汇率', |
295 | 318 | width: 150, |
... | ... | @@ -314,7 +337,7 @@ export const ORDER_LIST_PROFIT_FIELDS = [ |
314 | 337 | { |
315 | 338 | title: '利润率计算方式', |
316 | 339 | width: 150, |
317 | - dataIndex: 'profitRate', | |
340 | + dataIndex: 'profitType', | |
318 | 341 | customRender: (column) => { |
319 | 342 | const { record } = column || {}; |
320 | 343 | return record?.profitAnalysisInfo?.profitType === '0' |
... | ... | @@ -960,54 +983,98 @@ export const FIELDS_PROFIT_INFO = [ |
960 | 983 | { |
961 | 984 | field: 'customerPrice', |
962 | 985 | component: 'InputNumber', |
963 | - label: '客户单价', | |
986 | + label: '客户单价$', | |
987 | + rules: [{ required: true }], | |
988 | + componentProps: { | |
989 | + precision: 2, | |
990 | + }, | |
991 | + }, | |
992 | + { | |
993 | + field: 'customerRmbPrice', | |
994 | + component: 'InputNumber', | |
995 | + label: '客户单价¥', | |
996 | + componentProps: { | |
997 | + precision: 2, | |
998 | + }, | |
964 | 999 | rules: [{ required: true }], |
965 | 1000 | }, |
966 | 1001 | // { |
1002 | + // field: 'customerPrice', | |
1003 | + // component: 'InputNumber', | |
1004 | + // label: '客户总金额', | |
1005 | + // rules: [{ required: true }], | |
1006 | + // }, | |
1007 | + // { | |
1008 | + // field: 'customerPrice', | |
1009 | + // component: 'InputNumber', | |
1010 | + // label: '客户总金额(人民币)', | |
1011 | + // rules: [{ required: true }], | |
1012 | + // }, | |
1013 | + // { | |
967 | 1014 | // field: 'customerTotalPrice', |
968 | 1015 | // component: 'InputNumber', |
969 | 1016 | // label: '客户总价', |
970 | 1017 | // rules: [{ required: true }], |
971 | 1018 | // }, |
972 | - { | |
973 | - field: 'customerCurrency', | |
974 | - component: 'Select', | |
975 | - label: '客户单价货币单位', | |
976 | - labelWidth: 400, | |
977 | - rules: [{ required: true }], | |
978 | - componentProps: { | |
979 | - options: [ | |
980 | - { label: '$', value: '$' }, | |
981 | - { label: '¥', value: '¥' }, | |
982 | - ], | |
983 | - }, | |
984 | - }, | |
1019 | + // { | |
1020 | + // field: 'customerCurrency', | |
1021 | + // component: 'Select', | |
1022 | + // label: '客户单价货币单位', | |
1023 | + // labelWidth: 400, | |
1024 | + // rules: [{ required: true }], | |
1025 | + // componentProps: { | |
1026 | + // options: [ | |
1027 | + // { label: '$', value: '$' }, | |
1028 | + // { label: '¥', value: '¥' }, | |
1029 | + // ], | |
1030 | + // }, | |
1031 | + // }, | |
985 | 1032 | { |
986 | 1033 | field: 'productionDepartmentPrice', |
987 | 1034 | component: 'InputNumber', |
988 | - label: '生产科单价', | |
1035 | + label: '生产科单价¥', | |
989 | 1036 | rules: [{ required: true }], |
990 | 1037 | }, |
1038 | + // { | |
1039 | + // field: 'productionDepartmentCurrency', | |
1040 | + // component: 'Select', | |
1041 | + // label: '生产科货币单位', | |
1042 | + // rules: [{ required: true }], | |
1043 | + // componentProps: { | |
1044 | + // options: [ | |
1045 | + // { label: '$', value: '$' }, | |
1046 | + // { label: '¥', value: '¥' }, | |
1047 | + // ], | |
1048 | + // }, | |
1049 | + // }, | |
1050 | + // { | |
1051 | + // field: 'productionDepartmentPrice', | |
1052 | + // component: 'InputNumber', | |
1053 | + // label: '生产科总价¥', | |
1054 | + // rules: [{ required: true }], | |
1055 | + // }, | |
991 | 1056 | { |
992 | - field: 'productionDepartmentCurrency', | |
1057 | + label: '计算利润方式', | |
993 | 1058 | component: 'Select', |
994 | - label: '生产科货币单位', | |
995 | - rules: [{ required: true }], | |
1059 | + field: 'profitType', | |
996 | 1060 | componentProps: { |
1061 | + defaultValue: '0', | |
997 | 1062 | options: [ |
998 | - { label: '$', value: '$' }, | |
999 | - { label: '¥', value: '¥' }, | |
1063 | + { label: '公式1:1 -(LOCAL总金额 / 汇率 + 包装总金额)/ 客户总金额', value: '0' }, | |
1064 | + { label: '公式2:1 -(LOCAL总金额 / 汇率 / (客户总金额 - 包装费用总金额)', value: '1' }, | |
1000 | 1065 | ], |
1001 | 1066 | }, |
1067 | + // rules: [{ required: true }], | |
1068 | + }, | |
1069 | + { | |
1070 | + label: '利润率', | |
1071 | + component: 'InputNumber', | |
1072 | + field: 'profitRate', | |
1073 | + fieldComponent: { disabled: true }, | |
1074 | + // rules: [{ required: true }], | |
1002 | 1075 | }, |
1003 | - // { | |
1004 | - // field: 'productionDepartmentPrice', | |
1005 | - // component: 'InputNumber', | |
1006 | - // label: '生产科总价¥', | |
1007 | - // rules: [{ required: true }], | |
1008 | - // }, | |
1009 | 1076 | { |
1010 | - label: '包装费用', | |
1077 | + label: '包装费用$', | |
1011 | 1078 | component: 'InputNumber', |
1012 | 1079 | field: 'packetPrice', |
1013 | 1080 | fieldComponent: { disabled: true }, |
... | ... | @@ -1046,19 +1113,6 @@ export const FIELDS_PROFIT_INFO = [ |
1046 | 1113 | // field: 'exchangeRate', |
1047 | 1114 | // // rules: [{ required: true }], |
1048 | 1115 | // }, |
1049 | - { | |
1050 | - label: '计算利润方式', | |
1051 | - component: 'Select', | |
1052 | - field: 'profitType', | |
1053 | - componentProps: { | |
1054 | - defaultValue: '0', | |
1055 | - options: [ | |
1056 | - { label: '方式一: 1 -(LOCAL单价 / 汇率 + 包装费用)/ 客户单价', value: '0' }, | |
1057 | - { label: '方式二: 1 -(LOCAL单价/汇率 / (客户单价-包装费用)', value: '1' }, | |
1058 | - ], | |
1059 | - }, | |
1060 | - // rules: [{ required: true }], | |
1061 | - }, | |
1062 | 1116 | ]; |
1063 | 1117 | |
1064 | 1118 | //质量检测信息 | ... | ... |