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,19 +84,29 @@ export function deleteConfig(params: LoginParams) { | ||
84 | // // }); | 84 | // // }); |
85 | // // }); | 85 | // // }); |
86 | // }; | 86 | // }; |
87 | - | ||
88 | export const getEmailList = async (params: any) => { | 87 | export const getEmailList = async (params: any) => { |
89 | const res = await defHttp.post<any>({ | 88 | const res = await defHttp.post<any>({ |
90 | url: Api.EMAIL_LIST, | 89 | url: Api.EMAIL_LIST, |
91 | params, | 90 | params, |
92 | }); | 91 | }); |
93 | const resAll = dealRecords(res.records); | 92 | const resAll = dealRecords(res.records); |
93 | + | ||
94 | resAll.sort((a, b) => { | 94 | resAll.sort((a, b) => { |
95 | + // 首先对 enableFlag 进行排序 | ||
95 | if (a.enableFlag === b.enableFlag) { | 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 | return 0; | 104 | return 0; |
97 | } | 105 | } |
106 | + // 否则根据 enableFlag 进行排序 | ||
98 | return a.enableFlag === 10 ? -1 : 1; | 107 | return a.enableFlag === 10 ? -1 : 1; |
99 | }); | 108 | }); |
109 | + | ||
100 | return resAll; | 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
@@ -93,7 +93,7 @@ | @@ -93,7 +93,7 @@ | ||
93 | const { record } = column || {}; | 93 | const { record } = column || {}; |
94 | return record?.orderBaseInfo?.innerNo; | 94 | return record?.orderBaseInfo?.innerNo; |
95 | }, | 95 | }, |
96 | - }, | 96 | + }, |
97 | { | 97 | { |
98 | title: '图片', | 98 | title: '图片', |
99 | dataIndex: 'picUrl', | 99 | dataIndex: 'picUrl', |
src/views/project/approve/ReceivePanel.vue
@@ -23,30 +23,32 @@ | @@ -23,30 +23,32 @@ | ||
23 | </template> | 23 | </template> |
24 | </template> | 24 | </template> |
25 | </BasicTable> | 25 | </BasicTable> |
26 | - <BasicDrawer | 26 | + <BasicModal |
27 | :showFooter="!isApproved && role === ROLE.ADMIN" | 27 | :showFooter="!isApproved && role === ROLE.ADMIN" |
28 | - @register="registerDrawer" | 28 | + @register="registerModal" |
29 | title="申请信息" | 29 | title="申请信息" |
30 | okText="通过" | 30 | okText="通过" |
31 | @ok="handleTrue" | 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 | <template #appendFooter> | 41 | <template #appendFooter> |
40 | <a-button @click="handleFalse"> 不通过</a-button> | 42 | <a-button @click="handleFalse"> 不通过</a-button> |
41 | </template> | 43 | </template> |
42 | - </BasicDrawer> | 44 | + </BasicModal> |
43 | <MsgModal v-if="msgVisible" @msg-modal-close="handleMsgModalClose" /> | 45 | <MsgModal v-if="msgVisible" @msg-modal-close="handleMsgModalClose" /> |
44 | </template> | 46 | </template> |
45 | <script lang="ts"> | 47 | <script lang="ts"> |
46 | import MsgModal from './MsgModal.vue'; | 48 | import MsgModal from './MsgModal.vue'; |
47 | import { computed, defineComponent, ref } from 'vue'; | 49 | import { computed, defineComponent, ref } from 'vue'; |
48 | import { BasicTable, useTable, TableAction } from '/@/components/Table'; | 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 | import { approveAuditApi, getApprovedListApi, getWaitListApi } from '/@/api/project/approve'; | 53 | import { approveAuditApi, getApprovedListApi, getWaitListApi } from '/@/api/project/approve'; |
52 | import { FIELDS_BASE_INFO, FIELDS_PROFIT_INFO, FIELDS_REPORT_INFO } from '../order/tableData'; | 54 | import { FIELDS_BASE_INFO, FIELDS_PROFIT_INFO, FIELDS_REPORT_INFO } from '../order/tableData'; |
@@ -55,14 +57,16 @@ | @@ -55,14 +57,16 @@ | ||
55 | import BaseInfo from './BaseInfo.vue'; | 57 | import BaseInfo from './BaseInfo.vue'; |
56 | import { createImgPreview } from '/@/components/Preview'; | 58 | import { createImgPreview } from '/@/components/Preview'; |
57 | import { getFormConfig } from './data'; | 59 | import { getFormConfig } from './data'; |
60 | + import { Description, DescItem, useDescription } from '@/components/Description'; | ||
58 | 61 | ||
59 | const userStore = useUserStoreWithOut(); | 62 | const userStore = useUserStoreWithOut(); |
60 | 63 | ||
61 | export default defineComponent({ | 64 | export default defineComponent({ |
62 | components: { | 65 | components: { |
63 | BasicTable, | 66 | BasicTable, |
64 | - BasicDrawer, | 67 | + BasicModal, |
65 | TableAction, | 68 | TableAction, |
69 | + Description, | ||
66 | BaseInfo, | 70 | BaseInfo, |
67 | MsgModal, | 71 | MsgModal, |
68 | }, | 72 | }, |
@@ -74,11 +78,44 @@ | @@ -74,11 +78,44 @@ | ||
74 | const msgVisible = ref(false); | 78 | const msgVisible = ref(false); |
75 | const checkedKeys = ref<Array<string | number>>([]); | 79 | const checkedKeys = ref<Array<string | number>>([]); |
76 | const currentKey = ref('1'); | 80 | const currentKey = ref('1'); |
77 | - const [registerDrawer, { openDrawer, closeDrawer }] = useDrawer(); | 81 | + const [registerModal, { openModal, closeModal }] = useModal(); |
78 | const fieldInfos = ref({}); | 82 | const fieldInfos = ref({}); |
79 | const baseInfos = ref({}); | 83 | const baseInfos = ref({}); |
80 | const id = ref(''); | 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 | let columns = [ | 119 | let columns = [ |
83 | { | 120 | { |
84 | title: '申请人', | 121 | title: '申请人', |
@@ -163,19 +200,24 @@ | @@ -163,19 +200,24 @@ | ||
163 | 200 | ||
164 | function handleProfitModal() {} | 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 | async function handleTrue() { | 210 | async function handleTrue() { |
169 | await approveAuditApi({ status: 10, id: id.value }); | 211 | await approveAuditApi({ status: 10, id: id.value }); |
170 | reload(); | 212 | reload(); |
171 | - closeDrawer(); | 213 | + closeModal(); |
172 | } | 214 | } |
173 | 215 | ||
174 | async function handleFalse() { | 216 | async function handleFalse() { |
175 | msgVisible.value = true; | 217 | msgVisible.value = true; |
176 | // await approveAuditApi({ status: 20, id: id.value }); | 218 | // await approveAuditApi({ status: 20, id: id.value }); |
177 | // reload(); | 219 | // reload(); |
178 | - // closeDrawer(); | 220 | + // closeModal(); |
179 | } | 221 | } |
180 | 222 | ||
181 | const role = computed(() => { | 223 | const role = computed(() => { |
@@ -187,7 +229,7 @@ | @@ -187,7 +229,7 @@ | ||
187 | if (data) { | 229 | if (data) { |
188 | await approveAuditApi({ status: 20, id: id.value, refuseRemark: data }); | 230 | await approveAuditApi({ status: 20, id: id.value, refuseRemark: data }); |
189 | reload(); | 231 | reload(); |
190 | - closeDrawer(); | 232 | + closeModal(); |
191 | } | 233 | } |
192 | msgVisible.value = false; | 234 | msgVisible.value = false; |
193 | }; | 235 | }; |
@@ -206,7 +248,7 @@ | @@ -206,7 +248,7 @@ | ||
206 | handleEdit, | 248 | handleEdit, |
207 | onSelectAll, | 249 | onSelectAll, |
208 | handleDetail, | 250 | handleDetail, |
209 | - registerDrawer, | 251 | + registerModal, |
210 | fieldInfos, | 252 | fieldInfos, |
211 | baseInfos, | 253 | baseInfos, |
212 | handleTrue, | 254 | handleTrue, |
@@ -216,6 +258,8 @@ | @@ -216,6 +258,8 @@ | ||
216 | msgVisible, | 258 | msgVisible, |
217 | handleMsgModalClose, | 259 | handleMsgModalClose, |
218 | handlePreview, | 260 | handlePreview, |
261 | + mockData, | ||
262 | + schema, | ||
219 | }; | 263 | }; |
220 | }, | 264 | }, |
221 | }); | 265 | }); |
src/views/project/approve/index.vue
@@ -13,6 +13,9 @@ | @@ -13,6 +13,9 @@ | ||
13 | <a-tab-pane key="7" tab="应收款待审核"> | 13 | <a-tab-pane key="7" tab="应收款待审核"> |
14 | <ReceivePanel /> | 14 | <ReceivePanel /> |
15 | </a-tab-pane> | 15 | </a-tab-pane> |
16 | + <a-tab-pane key="9" tab="应付款待审核"> | ||
17 | + <PayPanel /> | ||
18 | + </a-tab-pane> | ||
16 | <a-tab-pane key="2" tab="字段已审核"> | 19 | <a-tab-pane key="2" tab="字段已审核"> |
17 | <FieldPanel isApproved /> | 20 | <FieldPanel isApproved /> |
18 | </a-tab-pane> | 21 | </a-tab-pane> |
@@ -25,6 +28,9 @@ | @@ -25,6 +28,9 @@ | ||
25 | <a-tab-pane key="8" tab="应收款已审核"> | 28 | <a-tab-pane key="8" tab="应收款已审核"> |
26 | <ReceivePanel isApproved /> | 29 | <ReceivePanel isApproved /> |
27 | </a-tab-pane> | 30 | </a-tab-pane> |
31 | + <a-tab-pane key="10" tab="应付款已审核"> | ||
32 | + <PayPanel isApproved /> | ||
33 | + </a-tab-pane> | ||
28 | </a-tabs> | 34 | </a-tabs> |
29 | </div> | 35 | </div> |
30 | </template> | 36 | </template> |
@@ -35,6 +41,7 @@ | @@ -35,6 +41,7 @@ | ||
35 | import ProfitPanel from './ProfitPanel.vue'; | 41 | import ProfitPanel from './ProfitPanel.vue'; |
36 | import FieldPanel from './FieldPanel.vue'; | 42 | import FieldPanel from './FieldPanel.vue'; |
37 | import ReceivePanel from './ReceivePanel.vue'; | 43 | import ReceivePanel from './ReceivePanel.vue'; |
44 | + import PayPanel from './PayPanel.vue'; | ||
38 | import { useOrderStoreWithOut } from '/@/store/modules/order'; | 45 | import { useOrderStoreWithOut } from '/@/store/modules/order'; |
39 | 46 | ||
40 | const orderStore = useOrderStoreWithOut(); | 47 | const orderStore = useOrderStoreWithOut(); |
@@ -47,6 +54,7 @@ | @@ -47,6 +54,7 @@ | ||
47 | FieldPanel, | 54 | FieldPanel, |
48 | ProfitPanel, | 55 | ProfitPanel, |
49 | ReceivePanel, | 56 | ReceivePanel, |
57 | + PayPanel, | ||
50 | }, | 58 | }, |
51 | setup() { | 59 | setup() { |
52 | const checkedKeys = ref<Array<string | number>>([]); | 60 | const checkedKeys = ref<Array<string | number>>([]); |
src/views/project/config/DrawerCreate.vue
@@ -66,24 +66,24 @@ | @@ -66,24 +66,24 @@ | ||
66 | event: 'LATEST_DC_EVENT', | 66 | event: 'LATEST_DC_EVENT', |
67 | emails: [], | 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 | const schemas: FormSchema[] = [ | 88 | const schemas: FormSchema[] = [ |
89 | { | 89 | { |
src/views/project/config/DrawerEdit.vue
@@ -103,36 +103,36 @@ | @@ -103,36 +103,36 @@ | ||
103 | label: '最晚订舱时间(填写邮箱)', | 103 | label: '最晚订舱时间(填写邮箱)', |
104 | rules: [{ required: true }], | 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 | field: 'id', | 137 | field: 'id', |
138 | }, | 138 | }, |
src/views/project/config/data.tsx
1 | import { Tag } from 'ant-design-vue'; | 1 | import { Tag } from 'ant-design-vue'; |
2 | import { BasicColumn } from '@/components/Table'; | 2 | import { BasicColumn } from '@/components/Table'; |
3 | import { func } from 'vue-types'; | 3 | import { func } from 'vue-types'; |
4 | +import { h } from 'vue'; | ||
4 | 5 | ||
5 | export const COLUMNS = { | 6 | export const COLUMNS = { |
6 | 1: [ | 7 | 1: [ |
@@ -59,6 +60,48 @@ export const COLUMNS = { | @@ -59,6 +60,48 @@ export const COLUMNS = { | ||
59 | editRow: true, | 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 | export const columns: BasicColumn[] = [ | 107 | export const columns: BasicColumn[] = [ |
@@ -71,9 +114,18 @@ export const columns: BasicColumn[] = [ | @@ -71,9 +114,18 @@ export const columns: BasicColumn[] = [ | ||
71 | title: '状态', | 114 | title: '状态', |
72 | dataIndex: 'enableFlag', | 115 | dataIndex: 'enableFlag', |
73 | width: 100, | 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 | customRender: (column) => { | 121 | customRender: (column) => { |
75 | const { record } = column || {}; | 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,21 +158,21 @@ export const columns: BasicColumn[] = [ | ||
106 | dataIndex: 'latestDc', | 158 | dataIndex: 'latestDc', |
107 | width: 300, | 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 | export const columnsProduct: BasicColumn[] = [ | 178 | export const columnsProduct: BasicColumn[] = [ |
src/views/project/config/index.vue
@@ -19,6 +19,12 @@ | @@ -19,6 +19,12 @@ | ||
19 | <Tabs.TabPane key="5" tab="最后汇款日期"> | 19 | <Tabs.TabPane key="5" tab="最后汇款日期"> |
20 | <TablePanel :searchInfo="{ relationCode: 'orderHodTime' }" :column="5" /> | 20 | <TablePanel :searchInfo="{ relationCode: 'orderHodTime' }" :column="5" /> |
21 | </Tabs.TabPane> | 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 | </Tabs> | 28 | </Tabs> |
23 | </div> | 29 | </div> |
24 | </PageWrapper> | 30 | </PageWrapper> |
src/views/project/finance/pay/pay.data.tsx
@@ -106,16 +106,21 @@ export const columns: BasicColumn[] = [ | @@ -106,16 +106,21 @@ export const columns: BasicColumn[] = [ | ||
106 | dataIndex: 'actualPayedAmount3', | 106 | dataIndex: 'actualPayedAmount3', |
107 | width: 120, | 107 | width: 120, |
108 | }, | 108 | }, |
109 | + //需修改 | ||
109 | { | 110 | { |
110 | title: '生产科发票', | 111 | title: '生产科发票', |
111 | - dataIndex: 'invoiceUrl', | 112 | + dataIndex: 'invoiceStatus', |
112 | width: 120, | 113 | width: 120, |
113 | customRender: (column) => { | 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,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 | function handleShow(visible: boolean) { | 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,7 +20,13 @@ | ||
20 | <template #message> | 20 | <template #message> |
21 | <template v-if="checkedKeys.length > 0"> | 21 | <template v-if="checkedKeys.length > 0"> |
22 | <span>已选中{{ checkedKeys.length }}条记录(可跨页)</span> | 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 | </template> | 30 | </template> |
25 | <template v-else> | 31 | <template v-else> |
26 | <span>未选中任何订单</span> | 32 | <span>未选中任何订单</span> |
@@ -105,66 +111,93 @@ | @@ -105,66 +111,93 @@ | ||
105 | </template> | 111 | </template> |
106 | 112 | ||
107 | <template #toolbar> | 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 | </template> | 201 | </template> |
169 | </BasicTable> | 202 | </BasicTable> |
170 | <FormDetail | 203 | <FormDetail |
@@ -178,6 +211,8 @@ | @@ -178,6 +211,8 @@ | ||
178 | :customerCodes="selectedCustomCodes" | 211 | :customerCodes="selectedCustomCodes" |
179 | /> | 212 | /> |
180 | <InvoiceCreate @register="invoiceCreateModalRegister" /> | 213 | <InvoiceCreate @register="invoiceCreateModalRegister" /> |
214 | + <ServiceProfit @register="serviceProfitModalRegister" /> | ||
215 | + <ProductProfit @register="productProfitModalRegister" /> | ||
181 | <ProductInvoice @register="productInvoiceModalRegister" /> | 216 | <ProductInvoice @register="productInvoiceModalRegister" /> |
182 | <ProfitAnalysis @register="profitModalRegister" /> | 217 | <ProfitAnalysis @register="profitModalRegister" /> |
183 | <RateModal @register="rateModalRegister" /> | 218 | <RateModal @register="rateModalRegister" /> |
@@ -203,6 +238,8 @@ | @@ -203,6 +238,8 @@ | ||
203 | import ExportModal from './ExportModal.vue'; | 238 | import ExportModal from './ExportModal.vue'; |
204 | import PassCalculate from './PassCalculate.vue'; | 239 | import PassCalculate from './PassCalculate.vue'; |
205 | import InvoiceCreate from './InvoiceCreate.vue'; | 240 | import InvoiceCreate from './InvoiceCreate.vue'; |
241 | + import ServiceProfit from './ServiceProfit.vue'; | ||
242 | + import ProductProfit from './ProductProfit.vue'; | ||
206 | import ProductInvoice from './ProductInvoice.vue'; | 243 | import ProductInvoice from './ProductInvoice.vue'; |
207 | import { useModal } from '/@/components/Modal'; | 244 | import { useModal } from '/@/components/Modal'; |
208 | 245 | ||
@@ -241,7 +278,9 @@ | @@ -241,7 +278,9 @@ | ||
241 | FieldDetail, | 278 | FieldDetail, |
242 | RateModal, | 279 | RateModal, |
243 | InvoiceCreate, | 280 | InvoiceCreate, |
281 | + ServiceProfit, | ||
244 | ProductInvoice, | 282 | ProductInvoice, |
283 | + ProductProfit, | ||
245 | ExportModal, | 284 | ExportModal, |
246 | }, | 285 | }, |
247 | setup() { | 286 | setup() { |
@@ -249,6 +288,8 @@ | @@ -249,6 +288,8 @@ | ||
249 | // const selectedCustomCodes = ref<Array<string>>([]); | 288 | // const selectedCustomCodes = ref<Array<string>>([]); |
250 | const [profitModalRegister, { openModal: openProfitModal }] = useModal(); | 289 | const [profitModalRegister, { openModal: openProfitModal }] = useModal(); |
251 | const [invoiceCreateModalRegister, { openModal: openInvoiceCreateModal }] = useModal(); | 290 | const [invoiceCreateModalRegister, { openModal: openInvoiceCreateModal }] = useModal(); |
291 | + const [serviceProfitModalRegister, { openModal: openServiceProfitModal }] = useModal(); | ||
292 | + const [productProfitModalRegister, { openModal: openProductProfitModal }] = useModal(); | ||
252 | const [productInvoiceModalRegister, { openModal: openProductInvoiceModal }] = useModal(); | 293 | const [productInvoiceModalRegister, { openModal: openProductInvoiceModal }] = useModal(); |
253 | const [rateModalRegister, { openModal: openRateModal }] = useModal(); | 294 | const [rateModalRegister, { openModal: openRateModal }] = useModal(); |
254 | const [exportModalRegister, { openModal: openExportModal }] = useModal(); | 295 | const [exportModalRegister, { openModal: openExportModal }] = useModal(); |
@@ -632,6 +673,24 @@ | @@ -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 | const handleFormSuccess = () => { | 694 | const handleFormSuccess = () => { |
636 | reload(); | 695 | reload(); |
637 | }; | 696 | }; |
@@ -652,6 +711,8 @@ | @@ -652,6 +711,8 @@ | ||
652 | profitModalRegister, | 711 | profitModalRegister, |
653 | invoiceCreateModalRegister, | 712 | invoiceCreateModalRegister, |
654 | productInvoiceModalRegister, | 713 | productInvoiceModalRegister, |
714 | + serviceProfitModalRegister, | ||
715 | + productProfitModalRegister, | ||
655 | handleChange, | 716 | handleChange, |
656 | rateModalRegister, | 717 | rateModalRegister, |
657 | exportModalRegister, | 718 | exportModalRegister, |
@@ -692,6 +753,8 @@ | @@ -692,6 +753,8 @@ | ||
692 | openProductModal, | 753 | openProductModal, |
693 | openPassModal, | 754 | openPassModal, |
694 | handleDelete, | 755 | handleDelete, |
756 | + handleServiceProfitModal, | ||
757 | + handleProductProfitModal, | ||
695 | selectedCustomCodes, | 758 | selectedCustomCodes, |
696 | role, | 759 | role, |
697 | ROLE, | 760 | ROLE, |
@@ -724,6 +787,7 @@ | @@ -724,6 +787,7 @@ | ||
724 | .passCalculate .ant-select-selector { | 787 | .passCalculate .ant-select-selector { |
725 | background-color: #1890ff !important; | 788 | background-color: #1890ff !important; |
726 | color: white !important; | 789 | color: white !important; |
790 | + border-radius: 5px 5px 5px 5px !important; | ||
727 | } | 791 | } |
728 | 792 | ||
729 | .passCalculate .ant-select-selection-item { | 793 | .passCalculate .ant-select-selection-item { |
vite.config.ts
@@ -20,7 +20,8 @@ export default defineApplicationConfig({ | @@ -20,7 +20,8 @@ export default defineApplicationConfig({ | ||
20 | server: { | 20 | server: { |
21 | proxy: { | 21 | proxy: { |
22 | '/basic-api/order': { | 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 | // target: 'http://39.108.227.113:8000', | 25 | // target: 'http://39.108.227.113:8000', |
25 | // target: 'http://localhost:8000', | 26 | // target: 'http://localhost:8000', |
26 | // target: 'http://39.108.227.113:3000/mock/35', | 27 | // target: 'http://39.108.227.113:3000/mock/35', |
@@ -30,7 +31,8 @@ export default defineApplicationConfig({ | @@ -30,7 +31,8 @@ export default defineApplicationConfig({ | ||
30 | rewrite: (path) => path.replace(new RegExp(`^/basic-api`), ''), | 31 | rewrite: (path) => path.replace(new RegExp(`^/basic-api`), ''), |
31 | }, | 32 | }, |
32 | '/api/localStorage/upload': { | 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 | // target: 'http://39.108.227.113:8000', | 36 | // target: 'http://39.108.227.113:8000', |
35 | // target: '192.168.31.250:18000', | 37 | // target: '192.168.31.250:18000', |
36 | // target: 'http://localhost:8000', | 38 | // target: 'http://localhost:8000', |