Commit 5b4ea797632847022eda49612c1c28ec3ca7c370

Authored by boyang
2 parents 4d629b54 fd4f91e4

系统配置销售额,利润分析表

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
... ... @@ -93,7 +93,7 @@
93 93 const { record } = column || {};
94 94 return record?.orderBaseInfo?.innerNo;
95 95 },
96   - },
  96 + },
97 97 {
98 98 title: '图片',
99 99 dataIndex: 'picUrl',
... ...
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',
... ...