Commit 5b4ea797632847022eda49612c1c28ec3ca7c370
系统配置销售额,利润分析表
Showing
15 changed files
with
931 additions
and
151 deletions
src/api/sys/config.ts
... | ... | @@ -84,19 +84,29 @@ export function deleteConfig(params: LoginParams) { |
84 | 84 | // // }); |
85 | 85 | // // }); |
86 | 86 | // }; |
87 | - | |
88 | 87 | export const getEmailList = async (params: any) => { |
89 | 88 | const res = await defHttp.post<any>({ |
90 | 89 | url: Api.EMAIL_LIST, |
91 | 90 | params, |
92 | 91 | }); |
93 | 92 | const resAll = dealRecords(res.records); |
93 | + | |
94 | 94 | resAll.sort((a, b) => { |
95 | + // 首先对 enableFlag 进行排序 | |
95 | 96 | if (a.enableFlag === b.enableFlag) { |
97 | + // 如果 enableFlag 相同,再对 customerCode 进行排序 | |
98 | + if (a.typeValue < b.typeValue) { | |
99 | + return -1; | |
100 | + } | |
101 | + if (a.typeValue > b.typeValue) { | |
102 | + return 1; | |
103 | + } | |
96 | 104 | return 0; |
97 | 105 | } |
106 | + // 否则根据 enableFlag 进行排序 | |
98 | 107 | return a.enableFlag === 10 ? -1 : 1; |
99 | 108 | }); |
109 | + | |
100 | 110 | return resAll; |
101 | 111 | }; |
102 | 112 | ... | ... |
src/views/project/approve/PayPanel.vue
0 → 100644
1 | +<template> | |
2 | + <BasicTable @register="registerTable" className="p-0"> | |
3 | + <template #form-custom> custom-slot </template> | |
4 | + <template #bodyCell="{ column, record }"> | |
5 | + <template v-if="column.key === 'picUrl'"> | |
6 | + <img | |
7 | + :width="50" | |
8 | + :height="50" | |
9 | + :src="record?.orderBaseInfo?.smallPicUrl" | |
10 | + @click="handlePreview(record?.orderBaseInfo?.picUrl)" | |
11 | + /> | |
12 | + </template> | |
13 | + <template v-if="column.key === 'action'"> | |
14 | + <TableAction | |
15 | + :actions="[ | |
16 | + { | |
17 | + label: '编辑', | |
18 | + // icon: 'ic:outline-delete-outline', | |
19 | + onClick: handleDetail.bind(null, record), | |
20 | + }, | |
21 | + ]" | |
22 | + /> | |
23 | + </template> | |
24 | + </template> | |
25 | + </BasicTable> | |
26 | + <BasicModal | |
27 | + :showFooter="!isApproved && role === ROLE.ADMIN" | |
28 | + @register="registerModal" | |
29 | + title="申请信息" | |
30 | + okText="通过" | |
31 | + @ok="handleTrue" | |
32 | + > | |
33 | + <Description | |
34 | + class="mt-4" | |
35 | + layout="vertical" | |
36 | + :collapseOptions="{ canExpand: true, helpMessage: 'help me' }" | |
37 | + :column="2" | |
38 | + :data="mockData" | |
39 | + :schema="schema" | |
40 | + /> | |
41 | + <template #appendFooter> | |
42 | + <a-button @click="handleFalse"> 不通过</a-button> | |
43 | + </template> | |
44 | + </BasicModal> | |
45 | + <MsgModal v-if="msgVisible" @msg-modal-close="handleMsgModalClose" /> | |
46 | +</template> | |
47 | +<script lang="ts"> | |
48 | + import MsgModal from './MsgModal.vue'; | |
49 | + import { computed, defineComponent, ref } from 'vue'; | |
50 | + import { BasicTable, useTable, TableAction } from '/@/components/Table'; | |
51 | + import { BasicModal, useModal } from '/@/components/Modal'; | |
52 | + | |
53 | + import { approveAuditApi, getApprovedListApi, getWaitListApi } from '/@/api/project/approve'; | |
54 | + import { FIELDS_BASE_INFO, FIELDS_PROFIT_INFO, FIELDS_REPORT_INFO } from '../order/tableData'; | |
55 | + import { ROLE } from '../order//type.d'; | |
56 | + import { useUserStoreWithOut } from '/@/store/modules/user'; | |
57 | + import BaseInfo from './BaseInfo.vue'; | |
58 | + import { createImgPreview } from '/@/components/Preview'; | |
59 | + import { getFormConfig } from './data'; | |
60 | + import { Description, DescItem, useDescription } from '@/components/Description'; | |
61 | + | |
62 | + const userStore = useUserStoreWithOut(); | |
63 | + | |
64 | + export default defineComponent({ | |
65 | + components: { | |
66 | + BasicTable, | |
67 | + BasicModal, | |
68 | + TableAction, | |
69 | + Description, | |
70 | + BaseInfo, | |
71 | + MsgModal, | |
72 | + }, | |
73 | + props: { | |
74 | + isApproved: { type: Boolean }, | |
75 | + }, | |
76 | + setup(props) { | |
77 | + // visible 用于msgModal显示隐藏 | |
78 | + const msgVisible = ref(false); | |
79 | + const checkedKeys = ref<Array<string | number>>([]); | |
80 | + const currentKey = ref('1'); | |
81 | + const [registerModal, { openModal, closeModal }] = useModal(); | |
82 | + const fieldInfos = ref({}); | |
83 | + const baseInfos = ref({}); | |
84 | + const id = ref(''); | |
85 | + | |
86 | + const mockData = ref(); | |
87 | + const schema: DescItem[] = [ | |
88 | + { | |
89 | + field: 'actualReceivableAmount', | |
90 | + label: '生产科实际应付金额汇总', | |
91 | + }, | |
92 | + { | |
93 | + field: 'all', | |
94 | + label: '生产科付款日期', | |
95 | + }, | |
96 | + { | |
97 | + field: 'deductAmount', | |
98 | + label: '实际付款日期', | |
99 | + }, | |
100 | + { | |
101 | + field: 'productionDepartmentTotalPrice', | |
102 | + label: '生产科总金额汇总', | |
103 | + }, | |
104 | + { | |
105 | + field: 'actualPayedAmount', | |
106 | + label: '实际付款金额汇总', | |
107 | + }, | |
108 | + { | |
109 | + field: 'actualReceivableAmount', | |
110 | + label: '生产科扣款金额汇总', | |
111 | + }, | |
112 | + ]; | |
113 | + // const [register] = useDescription({ | |
114 | + // title: 'useDescription', | |
115 | + // data: mockData, | |
116 | + // schema: schema, | |
117 | + // }); | |
118 | + | |
119 | + let columns = [ | |
120 | + { | |
121 | + title: '申请人', | |
122 | + dataIndex: 'createBy', | |
123 | + width: 150, | |
124 | + }, | |
125 | + // { | |
126 | + // title: '内部编号', | |
127 | + // dataIndex: 'innerNo', | |
128 | + // width: 150, | |
129 | + // customRender: (column) => { | |
130 | + // const { record } = column || {}; | |
131 | + // return record?.fieldInfos?.invoiceBillOrderDO?.innerNo; | |
132 | + // }, | |
133 | + // }, | |
134 | + { | |
135 | + title: 'INVOICE编号', | |
136 | + dataIndex: 'invoiceNo', | |
137 | + width: 150, | |
138 | + customRender: (column) => { | |
139 | + const { record } = column || {}; | |
140 | + return record?.fieldInfos?.invoiceBillOrderDO?.invoiceNo; | |
141 | + }, | |
142 | + }, | |
143 | + { | |
144 | + title: '生产科', | |
145 | + dataIndex: 'productionDepartment', | |
146 | + width: 150, | |
147 | + }, | |
148 | + ]; | |
149 | + | |
150 | + if (props.isApproved) { | |
151 | + columns = columns.concat([ | |
152 | + { | |
153 | + title: '状态', | |
154 | + dataIndex: 'status', | |
155 | + width: 150, | |
156 | + customRender: (column) => { | |
157 | + const { record } = column || {}; | |
158 | + | |
159 | + return record.status === 10 ? '通过' : '拒绝'; | |
160 | + }, | |
161 | + }, | |
162 | + { title: '拒绝原因', dataIndex: 'refuseRemark', width: 250 }, | |
163 | + ]); | |
164 | + } | |
165 | + | |
166 | + const [registerTable, { reload }] = useTable({ | |
167 | + api: props.isApproved ? getApprovedListApi : getWaitListApi, | |
168 | + searchInfo: { type: 40 }, | |
169 | + // scroll: { | |
170 | + // scrollToFirstRowOnChange: true, | |
171 | + // }, | |
172 | + columns, | |
173 | + useSearchForm: true, | |
174 | + formConfig: getFormConfig(), | |
175 | + rowKey: 'id', | |
176 | + actionColumn: { | |
177 | + width: 160, | |
178 | + title: 'Action', | |
179 | + dataIndex: 'action', | |
180 | + // slots: { customRender: 'action' }, | |
181 | + }, | |
182 | + }); | |
183 | + | |
184 | + function onSelect(record, selected) { | |
185 | + if (selected) { | |
186 | + checkedKeys.value = [...checkedKeys.value, record.id]; | |
187 | + } else { | |
188 | + checkedKeys.value = checkedKeys.value.filter((id) => id !== record.id); | |
189 | + } | |
190 | + } | |
191 | + function onSelectAll(selected, selectedRows, changeRows) { | |
192 | + const changeIds = changeRows.map((item) => item.id); | |
193 | + if (selected) { | |
194 | + checkedKeys.value = [...checkedKeys.value, ...changeIds]; | |
195 | + } else { | |
196 | + checkedKeys.value = checkedKeys.value.filter((id) => { | |
197 | + return !changeIds.includes(id); | |
198 | + }); | |
199 | + } | |
200 | + } | |
201 | + function handleEdit(record, e) { | |
202 | + e?.stopPropagation(); | |
203 | + return false; | |
204 | + } | |
205 | + | |
206 | + function handleProfitModal() {} | |
207 | + | |
208 | + async function handleDetail(data) { | |
209 | + openModal(true, { data }); | |
210 | + mockData.value = data.fieldInfos.invoiceBillOrderDO; | |
211 | + console.log(mockData.value, 5656); | |
212 | + id.value = data.id; | |
213 | + } | |
214 | + | |
215 | + async function handleTrue() { | |
216 | + await approveAuditApi({ status: 10, id: id.value }); | |
217 | + reload(); | |
218 | + closeModal(); | |
219 | + } | |
220 | + | |
221 | + async function handleFalse() { | |
222 | + msgVisible.value = true; | |
223 | + // await approveAuditApi({ status: 20, id: id.value }); | |
224 | + // reload(); | |
225 | + // closeModal(); | |
226 | + } | |
227 | + | |
228 | + const role = computed(() => { | |
229 | + return userStore.getUserInfo?.roleSmallVO?.code; | |
230 | + }); | |
231 | + | |
232 | + // 定义MsgModalClose的事件,方便子组件调用 | |
233 | + const handleMsgModalClose = async (data) => { | |
234 | + if (data) { | |
235 | + await approveAuditApi({ status: 20, id: id.value, refuseRemark: data }); | |
236 | + reload(); | |
237 | + closeModal(); | |
238 | + } | |
239 | + msgVisible.value = false; | |
240 | + }; | |
241 | + | |
242 | + const handlePreview = (url) => { | |
243 | + createImgPreview({ imageList: [url], defaultWidth: 500 }); | |
244 | + return false; | |
245 | + }; | |
246 | + | |
247 | + return { | |
248 | + handleProfitModal, | |
249 | + registerTable, | |
250 | + checkedKeys, | |
251 | + currentKey, | |
252 | + onSelect, | |
253 | + handleEdit, | |
254 | + onSelectAll, | |
255 | + handleDetail, | |
256 | + registerModal, | |
257 | + fieldInfos, | |
258 | + baseInfos, | |
259 | + handleTrue, | |
260 | + handleFalse, | |
261 | + role, | |
262 | + ROLE, | |
263 | + msgVisible, | |
264 | + handleMsgModalClose, | |
265 | + handlePreview, | |
266 | + mockData, | |
267 | + schema, | |
268 | + }; | |
269 | + }, | |
270 | + }); | |
271 | +</script> | ... | ... |
src/views/project/approve/ProfitPanel.vue
src/views/project/approve/ReceivePanel.vue
... | ... | @@ -23,30 +23,32 @@ |
23 | 23 | </template> |
24 | 24 | </template> |
25 | 25 | </BasicTable> |
26 | - <BasicDrawer | |
26 | + <BasicModal | |
27 | 27 | :showFooter="!isApproved && role === ROLE.ADMIN" |
28 | - @register="registerDrawer" | |
28 | + @register="registerModal" | |
29 | 29 | title="申请信息" |
30 | 30 | okText="通过" |
31 | 31 | @ok="handleTrue" |
32 | 32 | > |
33 | - <BaseInfo :baseInfos="baseInfos" /> | |
34 | - <h2>收款单信息</h2> | |
35 | - <div v-for="field in fieldInfos" :key="field"> | |
36 | - <span className="w-[140px] inline-block text-right mr-3">{{ field.label }}:</span | |
37 | - ><span>{{ field.value }}</span> | |
38 | - </div> | |
33 | + <Description | |
34 | + class="mt-4" | |
35 | + layout="vertical" | |
36 | + :collapseOptions="{ canExpand: true, helpMessage: 'help me' }" | |
37 | + :column="2" | |
38 | + :data="mockData" | |
39 | + :schema="schema" | |
40 | + /> | |
39 | 41 | <template #appendFooter> |
40 | 42 | <a-button @click="handleFalse"> 不通过</a-button> |
41 | 43 | </template> |
42 | - </BasicDrawer> | |
44 | + </BasicModal> | |
43 | 45 | <MsgModal v-if="msgVisible" @msg-modal-close="handleMsgModalClose" /> |
44 | 46 | </template> |
45 | 47 | <script lang="ts"> |
46 | 48 | import MsgModal from './MsgModal.vue'; |
47 | 49 | import { computed, defineComponent, ref } from 'vue'; |
48 | 50 | import { BasicTable, useTable, TableAction } from '/@/components/Table'; |
49 | - import { BasicDrawer, useDrawer } from '/@/components/Drawer'; | |
51 | + import { BasicModal, useModal } from '/@/components/Modal'; | |
50 | 52 | |
51 | 53 | import { approveAuditApi, getApprovedListApi, getWaitListApi } from '/@/api/project/approve'; |
52 | 54 | import { FIELDS_BASE_INFO, FIELDS_PROFIT_INFO, FIELDS_REPORT_INFO } from '../order/tableData'; |
... | ... | @@ -55,14 +57,16 @@ |
55 | 57 | import BaseInfo from './BaseInfo.vue'; |
56 | 58 | import { createImgPreview } from '/@/components/Preview'; |
57 | 59 | import { getFormConfig } from './data'; |
60 | + import { Description, DescItem, useDescription } from '@/components/Description'; | |
58 | 61 | |
59 | 62 | const userStore = useUserStoreWithOut(); |
60 | 63 | |
61 | 64 | export default defineComponent({ |
62 | 65 | components: { |
63 | 66 | BasicTable, |
64 | - BasicDrawer, | |
67 | + BasicModal, | |
65 | 68 | TableAction, |
69 | + Description, | |
66 | 70 | BaseInfo, |
67 | 71 | MsgModal, |
68 | 72 | }, |
... | ... | @@ -74,11 +78,44 @@ |
74 | 78 | const msgVisible = ref(false); |
75 | 79 | const checkedKeys = ref<Array<string | number>>([]); |
76 | 80 | const currentKey = ref('1'); |
77 | - const [registerDrawer, { openDrawer, closeDrawer }] = useDrawer(); | |
81 | + const [registerModal, { openModal, closeModal }] = useModal(); | |
78 | 82 | const fieldInfos = ref({}); |
79 | 83 | const baseInfos = ref({}); |
80 | 84 | const id = ref(''); |
81 | 85 | |
86 | + const mockData = ref(); | |
87 | + const schema: DescItem[] = [ | |
88 | + { | |
89 | + field: 'actualReceivableAmount', | |
90 | + label: '实际收款金额汇总', | |
91 | + }, | |
92 | + { | |
93 | + field: 'all', | |
94 | + label: '客户总价金额汇总', | |
95 | + }, | |
96 | + { | |
97 | + field: 'deductAmount', | |
98 | + label: '发生扣款金额汇总', | |
99 | + }, | |
100 | + { | |
101 | + field: 'backRefundDate', | |
102 | + label: '必须回款日期', | |
103 | + }, | |
104 | + { | |
105 | + field: 'addr', | |
106 | + label: '实际回款日期', | |
107 | + }, | |
108 | + { | |
109 | + field: 'otherAmount', | |
110 | + label: '其他费用汇总', | |
111 | + }, | |
112 | + ]; | |
113 | + // const [register] = useDescription({ | |
114 | + // title: 'useDescription', | |
115 | + // data: mockData, | |
116 | + // schema: schema, | |
117 | + // }); | |
118 | + | |
82 | 119 | let columns = [ |
83 | 120 | { |
84 | 121 | title: '申请人', |
... | ... | @@ -163,19 +200,24 @@ |
163 | 200 | |
164 | 201 | function handleProfitModal() {} |
165 | 202 | |
166 | - async function handleDetail(data) {} | |
203 | + async function handleDetail(data) { | |
204 | + openModal(true, { data }); | |
205 | + mockData.value = data.fieldInfos.invoiceBillOrderDO; | |
206 | + console.log(mockData.value, 5656); | |
207 | + id.value = data.id; | |
208 | + } | |
167 | 209 | |
168 | 210 | async function handleTrue() { |
169 | 211 | await approveAuditApi({ status: 10, id: id.value }); |
170 | 212 | reload(); |
171 | - closeDrawer(); | |
213 | + closeModal(); | |
172 | 214 | } |
173 | 215 | |
174 | 216 | async function handleFalse() { |
175 | 217 | msgVisible.value = true; |
176 | 218 | // await approveAuditApi({ status: 20, id: id.value }); |
177 | 219 | // reload(); |
178 | - // closeDrawer(); | |
220 | + // closeModal(); | |
179 | 221 | } |
180 | 222 | |
181 | 223 | const role = computed(() => { |
... | ... | @@ -187,7 +229,7 @@ |
187 | 229 | if (data) { |
188 | 230 | await approveAuditApi({ status: 20, id: id.value, refuseRemark: data }); |
189 | 231 | reload(); |
190 | - closeDrawer(); | |
232 | + closeModal(); | |
191 | 233 | } |
192 | 234 | msgVisible.value = false; |
193 | 235 | }; |
... | ... | @@ -206,7 +248,7 @@ |
206 | 248 | handleEdit, |
207 | 249 | onSelectAll, |
208 | 250 | handleDetail, |
209 | - registerDrawer, | |
251 | + registerModal, | |
210 | 252 | fieldInfos, |
211 | 253 | baseInfos, |
212 | 254 | handleTrue, |
... | ... | @@ -216,6 +258,8 @@ |
216 | 258 | msgVisible, |
217 | 259 | handleMsgModalClose, |
218 | 260 | handlePreview, |
261 | + mockData, | |
262 | + schema, | |
219 | 263 | }; |
220 | 264 | }, |
221 | 265 | }); | ... | ... |
src/views/project/approve/index.vue
... | ... | @@ -13,6 +13,9 @@ |
13 | 13 | <a-tab-pane key="7" tab="应收款待审核"> |
14 | 14 | <ReceivePanel /> |
15 | 15 | </a-tab-pane> |
16 | + <a-tab-pane key="9" tab="应付款待审核"> | |
17 | + <PayPanel /> | |
18 | + </a-tab-pane> | |
16 | 19 | <a-tab-pane key="2" tab="字段已审核"> |
17 | 20 | <FieldPanel isApproved /> |
18 | 21 | </a-tab-pane> |
... | ... | @@ -25,6 +28,9 @@ |
25 | 28 | <a-tab-pane key="8" tab="应收款已审核"> |
26 | 29 | <ReceivePanel isApproved /> |
27 | 30 | </a-tab-pane> |
31 | + <a-tab-pane key="10" tab="应付款已审核"> | |
32 | + <PayPanel isApproved /> | |
33 | + </a-tab-pane> | |
28 | 34 | </a-tabs> |
29 | 35 | </div> |
30 | 36 | </template> |
... | ... | @@ -35,6 +41,7 @@ |
35 | 41 | import ProfitPanel from './ProfitPanel.vue'; |
36 | 42 | import FieldPanel from './FieldPanel.vue'; |
37 | 43 | import ReceivePanel from './ReceivePanel.vue'; |
44 | + import PayPanel from './PayPanel.vue'; | |
38 | 45 | import { useOrderStoreWithOut } from '/@/store/modules/order'; |
39 | 46 | |
40 | 47 | const orderStore = useOrderStoreWithOut(); |
... | ... | @@ -47,6 +54,7 @@ |
47 | 54 | FieldPanel, |
48 | 55 | ProfitPanel, |
49 | 56 | ReceivePanel, |
57 | + PayPanel, | |
50 | 58 | }, |
51 | 59 | setup() { |
52 | 60 | const checkedKeys = ref<Array<string | number>>([]); | ... | ... |
src/views/project/config/DrawerCreate.vue
... | ... | @@ -66,24 +66,24 @@ |
66 | 66 | event: 'LATEST_DC_EVENT', |
67 | 67 | emails: [], |
68 | 68 | }, |
69 | - { | |
70 | - fieldName: '尾期验货日期', | |
71 | - fieldValue: 'endCheckDate', | |
72 | - event: 'END_CHECK_DATE_EVENT', | |
73 | - emails: [], | |
74 | - }, | |
75 | - { | |
76 | - fieldName: '中期验货报告', | |
77 | - fieldValue: 'midCheckReport', | |
78 | - event: 'MID_CHECK_REPORT_EVENT', | |
79 | - emails: [], | |
80 | - }, | |
81 | - { | |
82 | - fieldName: '尾期验货报告', | |
83 | - fieldValue: 'endCheckReport', | |
84 | - event: 'END_CHECK_REPORT_EVENT', | |
85 | - emails: [], | |
86 | - }, | |
69 | + // { | |
70 | + // fieldName: '尾期验货日期', | |
71 | + // fieldValue: 'endCheckDate', | |
72 | + // event: 'END_CHECK_DATE_EVENT', | |
73 | + // emails: [], | |
74 | + // }, | |
75 | + // { | |
76 | + // fieldName: '中期验货报告', | |
77 | + // fieldValue: 'midCheckReport', | |
78 | + // event: 'MID_CHECK_REPORT_EVENT', | |
79 | + // emails: [], | |
80 | + // }, | |
81 | + // { | |
82 | + // fieldName: '尾期验货报告', | |
83 | + // fieldValue: 'endCheckReport', | |
84 | + // event: 'END_CHECK_REPORT_EVENT', | |
85 | + // emails: [], | |
86 | + // }, | |
87 | 87 | ]; |
88 | 88 | const schemas: FormSchema[] = [ |
89 | 89 | { | ... | ... |
src/views/project/config/DrawerEdit.vue
... | ... | @@ -103,36 +103,36 @@ |
103 | 103 | label: '最晚订舱时间(填写邮箱)', |
104 | 104 | rules: [{ required: true }], |
105 | 105 | }, |
106 | - { | |
107 | - field: 'endCheckDate', | |
108 | - component: 'InputTextArea', | |
109 | - labelWidth: 250, | |
110 | - colProps: { | |
111 | - span: 23, | |
112 | - }, | |
113 | - label: '尾期验货日期(填写邮箱)', | |
114 | - rules: [{ required: true }], | |
115 | - }, | |
116 | - { | |
117 | - field: 'midCheckReport', | |
118 | - component: 'InputTextArea', | |
119 | - labelWidth: 250, | |
120 | - colProps: { | |
121 | - span: 23, | |
122 | - }, | |
123 | - label: '中期验货报告(填写邮箱)', | |
124 | - rules: [{ required: true }], | |
125 | - }, | |
126 | - { | |
127 | - field: 'endCheckReport', | |
128 | - component: 'InputTextArea', | |
129 | - labelWidth: 250, | |
130 | - colProps: { | |
131 | - span: 23, | |
132 | - }, | |
133 | - label: '尾期验货报告(填写邮箱)', | |
134 | - rules: [{ required: true }], | |
135 | - }, | |
106 | + // { | |
107 | + // field: 'endCheckDate', | |
108 | + // component: 'InputTextArea', | |
109 | + // labelWidth: 250, | |
110 | + // colProps: { | |
111 | + // span: 23, | |
112 | + // }, | |
113 | + // label: '尾期验货日期(填写邮箱)', | |
114 | + // rules: [{ required: true }], | |
115 | + // }, | |
116 | + // { | |
117 | + // field: 'midCheckReport', | |
118 | + // component: 'InputTextArea', | |
119 | + // labelWidth: 250, | |
120 | + // colProps: { | |
121 | + // span: 23, | |
122 | + // }, | |
123 | + // label: '中期验货报告(填写邮箱)', | |
124 | + // rules: [{ required: true }], | |
125 | + // }, | |
126 | + // { | |
127 | + // field: 'endCheckReport', | |
128 | + // component: 'InputTextArea', | |
129 | + // labelWidth: 250, | |
130 | + // colProps: { | |
131 | + // span: 23, | |
132 | + // }, | |
133 | + // label: '尾期验货报告(填写邮箱)', | |
134 | + // rules: [{ required: true }], | |
135 | + // }, | |
136 | 136 | { |
137 | 137 | field: 'id', |
138 | 138 | }, | ... | ... |
src/views/project/config/data.tsx
1 | 1 | import { Tag } from 'ant-design-vue'; |
2 | 2 | import { BasicColumn } from '@/components/Table'; |
3 | 3 | import { func } from 'vue-types'; |
4 | +import { h } from 'vue'; | |
4 | 5 | |
5 | 6 | export const COLUMNS = { |
6 | 7 | 1: [ |
... | ... | @@ -59,6 +60,48 @@ export const COLUMNS = { |
59 | 60 | editRow: true, |
60 | 61 | }, |
61 | 62 | ], |
63 | + 6: [ | |
64 | + { | |
65 | + title: '客户编码', | |
66 | + dataIndex: 'settingValue', | |
67 | + width: 150, | |
68 | + }, | |
69 | + { | |
70 | + title: '固定成本', | |
71 | + dataIndex: 'relationValue', | |
72 | + width: 150, | |
73 | + editComponent: 'InputNumber', | |
74 | + editRow: true, | |
75 | + }, | |
76 | + { | |
77 | + title: '提成比例', | |
78 | + dataIndex: 'relationValue', | |
79 | + width: 150, | |
80 | + editComponent: 'InputNumber', | |
81 | + editRow: true, | |
82 | + }, | |
83 | + { | |
84 | + title: '生产科提成单价', | |
85 | + dataIndex: 'relationValue', | |
86 | + width: 150, | |
87 | + editComponent: 'InputNumber', | |
88 | + editRow: true, | |
89 | + }, | |
90 | + ], | |
91 | + 7: [ | |
92 | + { | |
93 | + title: '客户编码', | |
94 | + dataIndex: 'settingValue', | |
95 | + width: 150, | |
96 | + }, | |
97 | + { | |
98 | + title: '销售额', | |
99 | + dataIndex: 'salesAmount', | |
100 | + width: 150, | |
101 | + editComponent: 'InputNumber', | |
102 | + editRow: true, | |
103 | + }, | |
104 | + ], | |
62 | 105 | }; |
63 | 106 | |
64 | 107 | export const columns: BasicColumn[] = [ |
... | ... | @@ -71,9 +114,18 @@ export const columns: BasicColumn[] = [ |
71 | 114 | title: '状态', |
72 | 115 | dataIndex: 'enableFlag', |
73 | 116 | width: 100, |
117 | + // customRender: (column) => { | |
118 | + // const { record } = column || {}; | |
119 | + // return record.enableFlag === 10 ? <Tag color="green">启用</Tag> : <Tag color="red">禁用</Tag>; | |
120 | + // }, | |
74 | 121 | customRender: (column) => { |
75 | 122 | const { record } = column || {}; |
76 | - return record.enableFlag === 10 ? <Tag color="green">启用</Tag> : <Tag color="red">禁用</Tag>; | |
123 | + const enableFlag = record.enableFlag; | |
124 | + const enable = ~~enableFlag === 10; | |
125 | + // return record.enableFlag === 10 ? <Tag color="green">启用</Tag> : <Tag color="red">禁用</Tag>; | |
126 | + const color = enable ? 'green' : 'red'; | |
127 | + const text = enable ? '启用' : '禁用'; | |
128 | + return h(Tag, { color: color }, () => text); | |
77 | 129 | }, |
78 | 130 | }, |
79 | 131 | { |
... | ... | @@ -106,21 +158,21 @@ export const columns: BasicColumn[] = [ |
106 | 158 | dataIndex: 'latestDc', |
107 | 159 | width: 300, |
108 | 160 | }, |
109 | - { | |
110 | - title: '尾期验货日期', | |
111 | - dataIndex: 'endCheckDate', | |
112 | - width: 300, | |
113 | - }, | |
114 | - { | |
115 | - title: '中期验货报告', | |
116 | - dataIndex: 'midCheckReport', | |
117 | - width: 300, | |
118 | - }, | |
119 | - { | |
120 | - title: '尾期验货报告', | |
121 | - dataIndex: 'endCheckReport', | |
122 | - width: 300, | |
123 | - }, | |
161 | + // { | |
162 | + // title: '尾期验货日期', | |
163 | + // dataIndex: 'endCheckDate', | |
164 | + // width: 300, | |
165 | + // }, | |
166 | + // { | |
167 | + // title: '中期验货报告', | |
168 | + // dataIndex: 'midCheckReport', | |
169 | + // width: 300, | |
170 | + // }, | |
171 | + // { | |
172 | + // title: '尾期验货报告', | |
173 | + // dataIndex: 'endCheckReport', | |
174 | + // width: 300, | |
175 | + // }, | |
124 | 176 | ]; |
125 | 177 | |
126 | 178 | export const columnsProduct: BasicColumn[] = [ | ... | ... |
src/views/project/config/index.vue
... | ... | @@ -19,6 +19,12 @@ |
19 | 19 | <Tabs.TabPane key="5" tab="最后汇款日期"> |
20 | 20 | <TablePanel :searchInfo="{ relationCode: 'orderHodTime' }" :column="5" /> |
21 | 21 | </Tabs.TabPane> |
22 | + <Tabs.TabPane key="6" tab="提成成本配置"> | |
23 | + <TablePanel :searchInfo="{ relationCode: 'orderHodTime' }" :column="6" /> | |
24 | + </Tabs.TabPane> | |
25 | + <Tabs.TabPane key="7" tab="销售额配置"> | |
26 | + <TablePanel :searchInfo="{ relationCode: 'salesAmount' }" :column="7" /> | |
27 | + </Tabs.TabPane> | |
22 | 28 | </Tabs> |
23 | 29 | </div> |
24 | 30 | </PageWrapper> | ... | ... |
src/views/project/finance/pay/pay.data.tsx
... | ... | @@ -106,16 +106,21 @@ export const columns: BasicColumn[] = [ |
106 | 106 | dataIndex: 'actualPayedAmount3', |
107 | 107 | width: 120, |
108 | 108 | }, |
109 | + //需修改 | |
109 | 110 | { |
110 | 111 | title: '生产科发票', |
111 | - dataIndex: 'invoiceUrl', | |
112 | + dataIndex: 'invoiceStatus', | |
112 | 113 | width: 120, |
113 | 114 | customRender: (column) => { |
114 | - const deductUrl = column.record.invoiceUrl; | |
115 | - if (deductUrl == undefined) { | |
116 | - return; | |
115 | + if (column.record.invoiceStatus == -1) { | |
116 | + return '未提交审核'; | |
117 | + } else if (column.record.invoiceStatus == 0) { | |
118 | + return '待审核'; | |
119 | + } else if (column.record.invoiceStatus == 1) { | |
120 | + return '审核通过'; | |
121 | + } else if (column.record.invoiceStatus == 2) { | |
122 | + return '审核驳回'; | |
117 | 123 | } |
118 | - return <FilePptOutlined style="font-size:25px" onClick={() => window.open(deductUrl)} />; | |
119 | 124 | }, |
120 | 125 | }, |
121 | 126 | { | ... | ... |
src/views/project/order/ExportModal.vue
... | ... | @@ -104,7 +104,10 @@ |
104 | 104 | } |
105 | 105 | |
106 | 106 | // 质检不能导出任何 |
107 | - return [{ label: '质检信息', value: 'inspectionStageFields' }]; | |
107 | + return [ | |
108 | + { label: '基本信息', value: 'baseFields' }, | |
109 | + { label: '质检信息', value: 'inspectionStageFields' }, | |
110 | + ]; | |
108 | 111 | }); |
109 | 112 | |
110 | 113 | function handleShow(visible: boolean) { | ... | ... |
src/views/project/order/ProductProfit.vue
0 → 100644
1 | +<!-- <template> | |
2 | + <BasicModal | |
3 | + v-bind="$attrs" | |
4 | + @register="register" | |
5 | + title="生产对账单" | |
6 | + width="60%" | |
7 | + :bodyStyle="{ height: '500px' }" | |
8 | + @ok="handleOk" | |
9 | + > | |
10 | + </BasicModal> | |
11 | +</template> --> | |
12 | +<template> | |
13 | + <BasicModal | |
14 | + v-bind="$attrs" | |
15 | + @register="register" | |
16 | + title="内部生产净利润分析表" | |
17 | + width="60%" | |
18 | + :bodyStyle="{ height: '360px' }" | |
19 | + @ok="handleOk" | |
20 | + okText="导出" | |
21 | + > | |
22 | + <template #appendFooter> | |
23 | + <a-button style="background-color: #1890ff; color: white">计算</a-button> | |
24 | + </template> | |
25 | + <table | |
26 | + style=" | |
27 | + width: 100%; | |
28 | + border-collapse: collapse; | |
29 | + text-align: center; | |
30 | + border: 1px solid black; | |
31 | + font-size: 16px; | |
32 | + " | |
33 | + > | |
34 | + <thead> | |
35 | + <!-- <tr> | |
36 | + <th colspan="4" style="border: 1px solid black">净利润分析表</th> | |
37 | + </tr> --> | |
38 | + </thead> | |
39 | + <tbody> | |
40 | + <tr> | |
41 | + <td style="border: 1px solid black; width: 20%">项目号</td> | |
42 | + <td style="border: 1px solid black; width: 20%"></td> | |
43 | + <td style="border: 1px solid black; width: 20%">开始时间</td> | |
44 | + <td style="border: 1px solid black; width: 20%">结束时间</td> | |
45 | + <td style="border: 1px solid black; width: 20%">生产持续时间</td> | |
46 | + </tr> | |
47 | + <tr> | |
48 | + <td style="border: 1px solid black; width: 20%"></td> | |
49 | + <td style="border: 1px solid black; width: 20%">项目开发时间</td> | |
50 | + <td style="border: 1px solid black; width: 20%"></td> | |
51 | + <td style="border: 1px solid black; width: 20%"></td> | |
52 | + <td style="border: 1px solid black; width: 20%"></td> | |
53 | + </tr> | |
54 | + <tr> | |
55 | + <td style="border: 1px solid black; width: 20%">客户编码</td> | |
56 | + <td style="border: 1px solid black; width: 20%"></td> | |
57 | + <td style="border: 1px solid black; width: 20%">明细</td> | |
58 | + <td style="border: 1px solid black; width: 20%">金额</td> | |
59 | + <td style="border: 1px solid black; width: 20%">订单数量</td> | |
60 | + </tr> | |
61 | + <tr> | |
62 | + <td style="border: 1px solid black; width: 40%" colspan="2">生产科总价合计</td> | |
63 | + <td style="border: 1px solid black; width: 20%"></td> | |
64 | + <td style="border: 1px solid black; width: 20%"></td> | |
65 | + <td style="border: 1px solid black; width: 20%"></td> | |
66 | + </tr> | |
67 | + <tr> | |
68 | + <td style="border: 1px solid black; width: 40%" colspan="2">生产科预算金额</td> | |
69 | + <td style="border: 1px solid black; width: 20%"></td> | |
70 | + <td style="border: 1px solid black; width: 20%">预算占比</td> | |
71 | + <td style="border: 1px solid black; width: 20%">预算占比与实际占比差</td> | |
72 | + </tr> | |
73 | + <tr> | |
74 | + <td style="border: 1px solid black; width: 40%" colspan="2">实际发生费用</td> | |
75 | + <td style="border: 1px solid black; width: 20%"></td> | |
76 | + <td style="border: 1px solid black; width: 20%"></td> | |
77 | + <td style="border: 1px solid black; width: 20%"></td> | |
78 | + </tr> | |
79 | + <tr> | |
80 | + <td style="border: 1px solid black; width: 40%" colspan="2">内部生产毛利润</td> | |
81 | + <td style="border: 1px solid black; width: 20%"></td> | |
82 | + <td style="border: 1px solid black; width: 20%"></td> | |
83 | + <td style="border: 1px solid black; width: 20%"></td> | |
84 | + </tr> | |
85 | + <tr> | |
86 | + <td style="border: 1px solid black; width: 40%" colspan="2">内部生产固定成本</td> | |
87 | + <td style="border: 1px solid black; width: 20%"></td> | |
88 | + <td style="border: 1px solid black; width: 20%"></td> | |
89 | + <td style="border: 1px solid black; width: 20%"></td> | |
90 | + </tr> | |
91 | + <tr> | |
92 | + <td style="border: 1px solid black; width: 40%" colspan="2">内部生产提交</td> | |
93 | + <td style="border: 1px solid black; width: 20%"></td> | |
94 | + <td style="border: 1px solid black; width: 20%"></td> | |
95 | + <td style="border: 1px solid black; width: 20%"></td> | |
96 | + </tr> | |
97 | + <tr> | |
98 | + <td style="border: 1px solid black; width: 40%" colspan="2">内部生产净利润</td> | |
99 | + <td style="border: 1px solid black; width: 20%"></td> | |
100 | + <td style="border: 1px solid black; width: 20%"></td> | |
101 | + <td style="border: 1px solid black; width: 20%"></td> | |
102 | + </tr> | |
103 | + </tbody> | |
104 | + </table> | |
105 | + </BasicModal> | |
106 | +</template> | |
107 | +<script lang="ts" setup> | |
108 | + import { BasicModal, useModalInner } from '@/components/Modal'; | |
109 | + import { computed, ref } from 'vue'; | |
110 | + import { payDate, checkCreate } from '@/api/project/invoice'; | |
111 | + | |
112 | + const Input1 = ref(''); | |
113 | + const Input2 = ref(); | |
114 | + const res = ref(); | |
115 | + const [register, { closeModal }] = useModalInner(async (data) => { | |
116 | + res.value = data.data; | |
117 | + console.log(Input2.value, 565656); | |
118 | + }); | |
119 | + async function handleOk() { | |
120 | + closeModal(); | |
121 | + } | |
122 | +</script> | |
123 | +<style scoped> | |
124 | + .divAll { | |
125 | + display: flex; | |
126 | + justify-content: center; | |
127 | + align-items: center; | |
128 | + } | |
129 | +</style> | ... | ... |
src/views/project/order/ServiceProfit.vue
0 → 100644
1 | +<!-- <template> | |
2 | + <BasicModal | |
3 | + v-bind="$attrs" | |
4 | + @register="register" | |
5 | + title="生产对账单" | |
6 | + width="60%" | |
7 | + :bodyStyle="{ height: '500px' }" | |
8 | + @ok="handleOk" | |
9 | + > | |
10 | + </BasicModal> | |
11 | +</template> --> | |
12 | +<template> | |
13 | + <BasicModal | |
14 | + v-bind="$attrs" | |
15 | + @register="register" | |
16 | + title="净利润分析表" | |
17 | + width="60%" | |
18 | + :bodyStyle="{ height: '455px' }" | |
19 | + @ok="handleOk" | |
20 | + okText="导出" | |
21 | + > | |
22 | + <template #appendFooter> | |
23 | + <a-button style="background-color: #1890ff; color: white">计算</a-button> | |
24 | + </template> | |
25 | + <table | |
26 | + style=" | |
27 | + width: 100%; | |
28 | + border-collapse: collapse; | |
29 | + text-align: center; | |
30 | + border: 1px solid black; | |
31 | + font-size: 16px; | |
32 | + " | |
33 | + > | |
34 | + <thead> | |
35 | + <!-- <tr> | |
36 | + <th colspan="4" style="border: 1px solid black">净利润分析表</th> | |
37 | + </tr> --> | |
38 | + </thead> | |
39 | + <tbody> | |
40 | + <tr> | |
41 | + <td style="border: 1px solid black; width: 25%">项目号</td> | |
42 | + <td style="border: 1px solid black; width: 25%">M01-214425</td> | |
43 | + <td style="border: 1px solid black; width: 25%">开始时间</td> | |
44 | + <td style="border: 1px solid black; width: 25%">结束时间</td> | |
45 | + </tr> | |
46 | + <tr> | |
47 | + <td style="border: 1px solid black"></td> | |
48 | + <td style="border: 1px solid black">项目开始时间</td> | |
49 | + <td style="border: 1px solid black"></td> | |
50 | + <td style="border: 1px solid black"></td> | |
51 | + </tr> | |
52 | + <tr> | |
53 | + <td style="border: 1px solid black"></td> | |
54 | + <td style="border: 1px solid black">生产进行时间</td> | |
55 | + <td style="border: 1px solid black"></td> | |
56 | + <td style="border: 1px solid black"></td> | |
57 | + </tr> | |
58 | + <tr> | |
59 | + <td style="border: 1px solid black">客户编码</td> | |
60 | + <td style="border: 1px solid black">M01</td> | |
61 | + <td style="border: 1px solid black"></td> | |
62 | + <td style="border: 1px solid black">备注</td> | |
63 | + </tr> | |
64 | + <tr> | |
65 | + <td style="border: 1px solid black" colspan="2">客户总金额合计</td> | |
66 | + <td style="border: 1px solid black"></td> | |
67 | + <td style="border: 1px solid black"></td> | |
68 | + </tr> | |
69 | + <tr> | |
70 | + <td style="border: 1px solid black" colspan="2">生产科总价合计</td> | |
71 | + <td style="border: 1px solid black"></td> | |
72 | + <td style="border: 1px solid black"></td> | |
73 | + </tr> | |
74 | + <tr> | |
75 | + <td style="border: 1px solid black" colspan="2">包装费用合计</td> | |
76 | + <td style="border: 1px solid black"></td> | |
77 | + <td style="border: 1px solid black"></td> | |
78 | + </tr> | |
79 | + <tr> | |
80 | + <td style="border: 1px solid black" colspan="2">研发开发费合计</td> | |
81 | + <td style="border: 1px solid black"></td> | |
82 | + <td style="border: 1px solid black"></td> | |
83 | + </tr> | |
84 | + <tr> | |
85 | + <td style="border: 1px solid black" colspan="2">复制费用合计</td> | |
86 | + <td style="border: 1px solid black"></td> | |
87 | + <td style="border: 1px solid black"></td> | |
88 | + </tr> | |
89 | + <tr> | |
90 | + <td style="border: 1px solid black" colspan="2">固定成本</td> | |
91 | + <td style="border: 1px solid black"></td> | |
92 | + <td style="border: 1px solid black"></td> | |
93 | + </tr> | |
94 | + <tr> | |
95 | + <td style="border: 1px solid black" colspan="2">西班牙提成</td> | |
96 | + <td style="border: 1px solid black"></td> | |
97 | + <td style="border: 1px solid black"></td> | |
98 | + </tr> | |
99 | + <tr> | |
100 | + <td style="border: 1px solid black" colspan="2">中国团队提成</td> | |
101 | + <td style="border: 1px solid black"></td> | |
102 | + <td style="border: 1px solid black"></td> | |
103 | + </tr> | |
104 | + <tr> | |
105 | + <td style="border: 1px solid black" colspan="2">支出合计</td> | |
106 | + <td style="border: 1px solid black"></td> | |
107 | + <td style="border: 1px solid black"></td> | |
108 | + </tr> | |
109 | + <tr> | |
110 | + <td style="border: 1px solid black" colspan="2">毛利润</td> | |
111 | + <td style="border: 1px solid black"></td> | |
112 | + <td style="border: 1px solid black"></td> | |
113 | + </tr> | |
114 | + <tr> | |
115 | + <td style="border: 1px solid black" colspan="2">研发贸易净利润</td> | |
116 | + <td style="border: 1px solid black"></td> | |
117 | + <td style="border: 1px solid black"></td> | |
118 | + </tr> | |
119 | + <tr> | |
120 | + <td style="border: 1px solid black" colspan="2">包装费用合计金额</td> | |
121 | + <td style="border: 1px solid black"></td> | |
122 | + <td style="border: 1px solid black"></td> | |
123 | + </tr> | |
124 | + <tr> | |
125 | + <td style="border: 1px solid black" colspan="2">包装费用实际金额</td> | |
126 | + <td style="border: 1px solid black"></td> | |
127 | + <td style="border: 1px solid black"></td> | |
128 | + </tr> | |
129 | + <tr> | |
130 | + <td style="border: 1px solid black" colspan="2">订单总数量</td> | |
131 | + <td style="border: 1px solid black"></td> | |
132 | + <td style="border: 1px solid black"></td> | |
133 | + </tr> | |
134 | + <tr> | |
135 | + <td style="border: 1px solid black" colspan="2">实际跟单单价=实际跟单费用/件数</td> | |
136 | + <td style="border: 1px solid black"></td> | |
137 | + <td style="border: 1px solid black"></td> | |
138 | + </tr> | |
139 | + <tr> | |
140 | + <td style="border: 1px solid black" colspan="2">实际跟单单价折算美金</td> | |
141 | + <td style="border: 1px solid black"></td> | |
142 | + <td style="border: 1px solid black"></td> | |
143 | + </tr> | |
144 | + <tr> | |
145 | + <td style="border: 1px solid black" colspan="2">包装费用收益</td> | |
146 | + <td style="border: 1px solid black"></td> | |
147 | + <td style="border: 1px solid black"></td> | |
148 | + </tr> | |
149 | + <tr> | |
150 | + <td style="border: 1px solid black" colspan="2">汇率收益</td> | |
151 | + <td style="border: 1px solid black"></td> | |
152 | + <td style="border: 1px solid black"></td> | |
153 | + </tr> | |
154 | + <tr> | |
155 | + <td style="border: 1px solid black" colspan="2">综合收益</td> | |
156 | + <td style="border: 1px solid black"></td> | |
157 | + <td style="border: 1px solid black"></td> | |
158 | + </tr> | |
159 | + </tbody> | |
160 | + </table> | |
161 | + </BasicModal> | |
162 | +</template> | |
163 | +<script lang="ts" setup> | |
164 | + import { BasicModal, useModalInner } from '@/components/Modal'; | |
165 | + import { computed, ref } from 'vue'; | |
166 | + import { payDate, checkCreate } from '@/api/project/invoice'; | |
167 | + import { Description, DescItem, useDescription } from '@/components/Description'; | |
168 | + | |
169 | + const Input1 = ref(''); | |
170 | + const Input2 = ref(); | |
171 | + const res = ref(); | |
172 | + const [register, { closeModal }] = useModalInner(async (data) => { | |
173 | + res.value = data.data; | |
174 | + console.log(Input2.value, 565656); | |
175 | + }); | |
176 | + async function handleOk() { | |
177 | + closeModal(); | |
178 | + } | |
179 | +</script> | |
180 | +<style scoped> | |
181 | + .divAll { | |
182 | + display: flex; | |
183 | + justify-content: center; | |
184 | + align-items: center; | |
185 | + } | |
186 | +</style> | ... | ... |
src/views/project/order/index.vue
... | ... | @@ -20,7 +20,13 @@ |
20 | 20 | <template #message> |
21 | 21 | <template v-if="checkedKeys.length > 0"> |
22 | 22 | <span>已选中{{ checkedKeys.length }}条记录(可跨页)</span> |
23 | - <a-button type="link" @click="checkedKeys = []" size="small">清空</a-button> | |
23 | + <a-button | |
24 | + :style="{ borderRadius: '5px 5px 5px 5px' }" | |
25 | + type="link" | |
26 | + @click="checkedKeys = []" | |
27 | + size="small" | |
28 | + >清空</a-button | |
29 | + > | |
24 | 30 | </template> |
25 | 31 | <template v-else> |
26 | 32 | <span>未选中任何订单</span> |
... | ... | @@ -105,66 +111,93 @@ |
105 | 111 | </template> |
106 | 112 | |
107 | 113 | <template #toolbar> |
108 | - <a-button | |
109 | - type="primary" | |
110 | - @click="handleProductInvoiceModal" | |
111 | - v-if="role === ROLE.ADMIN || role === ROLE.BUSINESS || role === ROLE.TRACKER" | |
112 | - >生产对账单创建</a-button | |
113 | - > | |
114 | - <a-button | |
115 | - type="primary" | |
116 | - @click="handleInvoiceCreateModal" | |
117 | - v-if="role === ROLE.ADMIN || role === ROLE.BUSINESS || role === ROLE.TRACKER" | |
118 | - >Invoice创建</a-button | |
119 | - > | |
120 | - <a-select | |
121 | - ref="select" | |
122 | - v-model:value="value1" | |
123 | - style="width: 118px" | |
124 | - @change="handleChange" | |
125 | - class="passCalculate" | |
126 | - dropdown-class-name="dropdown-class" | |
127 | - v-if="role === ROLE.ADMIN || role === ROLE.TRACKER || role === ROLE.BUSINESS" | |
128 | - > | |
129 | - <a-select-option value1="一次通过率">一次通过率</a-select-option> | |
130 | - <a-select-option value="确认样品" @click="handlePassModal('确认意见')" | |
131 | - >确认样品</a-select-option | |
114 | + <div style="width: 1050px; padding-left: 50px"> | |
115 | + <!-- <a-space wrap :size="[8, 16]" :style="{ marginBottom: '2px', marginLeft: '10px' }"> --> | |
116 | + <a-space wrap :style="{ marginBottom: '2px', marginTop: '2px' }"> | |
117 | + <a-button | |
118 | + :style="{ borderRadius: '5px 5px 5px 5px' }" | |
119 | + type="primary" | |
120 | + @click="handleProductInvoiceModal" | |
121 | + v-if="role === ROLE.ADMIN || role === ROLE.BUSINESS || role === ROLE.TRACKER" | |
122 | + >生产对账单创建</a-button | |
123 | + > | |
124 | + <a-button | |
125 | + :style="{ borderRadius: '5px 5px 5px 5px' }" | |
126 | + shape="default" | |
127 | + type="primary" | |
128 | + @click="handleInvoiceCreateModal" | |
129 | + v-if="role === ROLE.ADMIN || role === ROLE.BUSINESS || role === ROLE.TRACKER" | |
130 | + >Invoice创建</a-button | |
131 | + > | |
132 | + <a-select | |
133 | + ref="select" | |
134 | + v-model:value="value1" | |
135 | + @change="handleChange" | |
136 | + class="passCalculate" | |
137 | + dropdown-class-name="dropdown-class" | |
138 | + v-if="role === ROLE.ADMIN || role === ROLE.TRACKER || role === ROLE.BUSINESS" | |
139 | + > | |
140 | + <a-select-option value1="一次通过率">一次通过率</a-select-option> | |
141 | + <a-select-option value="确认样品" @click="handlePassModal('确认意见')" | |
142 | + >确认样品</a-select-option | |
143 | + > | |
144 | + <a-select-option value="生产样品" @click="handlePassModal('生产样品')" | |
145 | + >生产样品</a-select-option | |
146 | + > | |
147 | + <a-select-option value="测试样品" @click="handlePassModal('测试样品')" | |
148 | + >测试样品</a-select-option | |
149 | + > | |
150 | + </a-select> | |
151 | + <a-button | |
152 | + :style="{ borderRadius: '5px 5px 5px 5px' }" | |
153 | + type="primary" | |
154 | + @click="handleProductProfitModal" | |
155 | + >内部生产净利润分析</a-button | |
156 | + > | |
157 | + <a-button | |
158 | + :style="{ borderRadius: '5px 5px 5px 5px' }" | |
159 | + type="primary" | |
160 | + @click="handleServiceProfitModal" | |
161 | + >业务/研发净利润分析</a-button | |
162 | + > | |
163 | + <a-button | |
164 | + :style="{ borderRadius: '5px 5px 5px 5px' }" | |
165 | + type="primary" | |
166 | + @click="handleProductModal" | |
167 | + v-if="role === ROLE.ADMIN || role === ROLE.BUSINESS || role === ROLE.TRACKER" | |
168 | + >生产指标书</a-button | |
169 | + > | |
170 | + <a-button | |
171 | + :style="{ borderRadius: '5px 5px 5px 5px' }" | |
172 | + type="primary" | |
173 | + @click="handleRateModal" | |
174 | + v-if="role === ROLE.ADMIN" | |
175 | + >比重计算</a-button | |
176 | + > | |
177 | + <!-- 质检角色不能导出任何信息 --> | |
178 | + <a-button | |
179 | + :style="{ borderRadius: '5px 5px 5px 5px' }" | |
180 | + type="primary" | |
181 | + @click="handleExportModal" | |
182 | + v-if="role === ROLE.ADMIN || role === ROLE.TRACKER || role === ROLE.BUSINESS" | |
183 | + >导出</a-button | |
184 | + > | |
185 | + <a-button | |
186 | + :style="{ borderRadius: '5px 5px 5px 5px' }" | |
187 | + type="primary" | |
188 | + @click="handleProfitModal" | |
189 | + v-if="role === ROLE.ADMIN || role === ROLE.BUSINESS" | |
190 | + >分析利润</a-button | |
191 | + > | |
192 | + <a-button | |
193 | + :style="{ borderRadius: '5px 5px 5px 5px' }" | |
194 | + type="primary" | |
195 | + @click="handleAdd" | |
196 | + v-if="role === ROLE.ADMIN || role === ROLE.TRACKER" | |
197 | + >创建订单</a-button | |
198 | + ></a-space | |
132 | 199 | > |
133 | - <a-select-option value="生产样品" @click="handlePassModal('生产样品')" | |
134 | - >生产样品</a-select-option | |
135 | - > | |
136 | - <a-select-option value="测试样品" @click="handlePassModal('测试样品')" | |
137 | - >测试样品</a-select-option | |
138 | - > | |
139 | - </a-select> | |
140 | - <a-button | |
141 | - type="primary" | |
142 | - @click="handleProductModal" | |
143 | - v-if="role === ROLE.ADMIN || role === ROLE.BUSINESS || role === ROLE.TRACKER" | |
144 | - >生产指标书</a-button | |
145 | - > | |
146 | - <a-button type="primary" @click="handleRateModal" v-if="role === ROLE.ADMIN" | |
147 | - >比重计算</a-button | |
148 | - > | |
149 | - <!-- 质检角色不能导出任何信息 --> | |
150 | - <a-button | |
151 | - type="primary" | |
152 | - @click="handleExportModal" | |
153 | - v-if="role === ROLE.ADMIN || role === ROLE.TRACKER || role === ROLE.BUSINESS" | |
154 | - >导出</a-button | |
155 | - > | |
156 | - <a-button | |
157 | - type="primary" | |
158 | - @click="handleProfitModal" | |
159 | - v-if="role === ROLE.ADMIN || role === ROLE.BUSINESS" | |
160 | - >分析利润</a-button | |
161 | - > | |
162 | - <a-button | |
163 | - type="primary" | |
164 | - @click="handleAdd" | |
165 | - v-if="role === ROLE.ADMIN || role === ROLE.TRACKER" | |
166 | - >创建订单</a-button | |
167 | - > | |
200 | + </div> | |
168 | 201 | </template> |
169 | 202 | </BasicTable> |
170 | 203 | <FormDetail |
... | ... | @@ -178,6 +211,8 @@ |
178 | 211 | :customerCodes="selectedCustomCodes" |
179 | 212 | /> |
180 | 213 | <InvoiceCreate @register="invoiceCreateModalRegister" /> |
214 | + <ServiceProfit @register="serviceProfitModalRegister" /> | |
215 | + <ProductProfit @register="productProfitModalRegister" /> | |
181 | 216 | <ProductInvoice @register="productInvoiceModalRegister" /> |
182 | 217 | <ProfitAnalysis @register="profitModalRegister" /> |
183 | 218 | <RateModal @register="rateModalRegister" /> |
... | ... | @@ -203,6 +238,8 @@ |
203 | 238 | import ExportModal from './ExportModal.vue'; |
204 | 239 | import PassCalculate from './PassCalculate.vue'; |
205 | 240 | import InvoiceCreate from './InvoiceCreate.vue'; |
241 | + import ServiceProfit from './ServiceProfit.vue'; | |
242 | + import ProductProfit from './ProductProfit.vue'; | |
206 | 243 | import ProductInvoice from './ProductInvoice.vue'; |
207 | 244 | import { useModal } from '/@/components/Modal'; |
208 | 245 | |
... | ... | @@ -241,7 +278,9 @@ |
241 | 278 | FieldDetail, |
242 | 279 | RateModal, |
243 | 280 | InvoiceCreate, |
281 | + ServiceProfit, | |
244 | 282 | ProductInvoice, |
283 | + ProductProfit, | |
245 | 284 | ExportModal, |
246 | 285 | }, |
247 | 286 | setup() { |
... | ... | @@ -249,6 +288,8 @@ |
249 | 288 | // const selectedCustomCodes = ref<Array<string>>([]); |
250 | 289 | const [profitModalRegister, { openModal: openProfitModal }] = useModal(); |
251 | 290 | const [invoiceCreateModalRegister, { openModal: openInvoiceCreateModal }] = useModal(); |
291 | + const [serviceProfitModalRegister, { openModal: openServiceProfitModal }] = useModal(); | |
292 | + const [productProfitModalRegister, { openModal: openProductProfitModal }] = useModal(); | |
252 | 293 | const [productInvoiceModalRegister, { openModal: openProductInvoiceModal }] = useModal(); |
253 | 294 | const [rateModalRegister, { openModal: openRateModal }] = useModal(); |
254 | 295 | const [exportModalRegister, { openModal: openExportModal }] = useModal(); |
... | ... | @@ -632,6 +673,24 @@ |
632 | 673 | }); |
633 | 674 | } |
634 | 675 | |
676 | + function handleServiceProfitModal() { | |
677 | + const form = getForm(); | |
678 | + const values = form.getFieldsValue(); | |
679 | + openServiceProfitModal(true, { | |
680 | + data: checkedKeys.value, | |
681 | + searchData: values, | |
682 | + }); | |
683 | + } | |
684 | + | |
685 | + function handleProductProfitModal() { | |
686 | + const form = getForm(); | |
687 | + const values = form.getFieldsValue(); | |
688 | + openProductProfitModal(true, { | |
689 | + data: checkedKeys.value, | |
690 | + searchData: values, | |
691 | + }); | |
692 | + } | |
693 | + | |
635 | 694 | const handleFormSuccess = () => { |
636 | 695 | reload(); |
637 | 696 | }; |
... | ... | @@ -652,6 +711,8 @@ |
652 | 711 | profitModalRegister, |
653 | 712 | invoiceCreateModalRegister, |
654 | 713 | productInvoiceModalRegister, |
714 | + serviceProfitModalRegister, | |
715 | + productProfitModalRegister, | |
655 | 716 | handleChange, |
656 | 717 | rateModalRegister, |
657 | 718 | exportModalRegister, |
... | ... | @@ -692,6 +753,8 @@ |
692 | 753 | openProductModal, |
693 | 754 | openPassModal, |
694 | 755 | handleDelete, |
756 | + handleServiceProfitModal, | |
757 | + handleProductProfitModal, | |
695 | 758 | selectedCustomCodes, |
696 | 759 | role, |
697 | 760 | ROLE, |
... | ... | @@ -724,6 +787,7 @@ |
724 | 787 | .passCalculate .ant-select-selector { |
725 | 788 | background-color: #1890ff !important; |
726 | 789 | color: white !important; |
790 | + border-radius: 5px 5px 5px 5px !important; | |
727 | 791 | } |
728 | 792 | |
729 | 793 | .passCalculate .ant-select-selection-item { | ... | ... |
vite.config.ts
... | ... | @@ -20,7 +20,8 @@ export default defineApplicationConfig({ |
20 | 20 | server: { |
21 | 21 | proxy: { |
22 | 22 | '/basic-api/order': { |
23 | - target: 'http://47.104.8.35:18000', | |
23 | + // target: 'http://47.104.8.35:18000', | |
24 | + target: 'http://localhost:8000', | |
24 | 25 | // target: 'http://39.108.227.113:8000', |
25 | 26 | // target: 'http://localhost:8000', |
26 | 27 | // target: 'http://39.108.227.113:3000/mock/35', |
... | ... | @@ -30,7 +31,8 @@ export default defineApplicationConfig({ |
30 | 31 | rewrite: (path) => path.replace(new RegExp(`^/basic-api`), ''), |
31 | 32 | }, |
32 | 33 | '/api/localStorage/upload': { |
33 | - target: 'http://47.104.8.35:18000', | |
34 | + // target: 'http://47.104.8.35:18000', | |
35 | + target: 'http://localhost:8000', | |
34 | 36 | // target: 'http://39.108.227.113:8000', |
35 | 37 | // target: '192.168.31.250:18000', |
36 | 38 | // target: 'http://localhost:8000', | ... | ... |