Commit 5b4ea797632847022eda49612c1c28ec3ca7c370

Authored by boyang
2 parents 4d629b54 fd4f91e4

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

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',