Commit 43dc180b28eee9d199842a49093c08484d2451d2

Authored by boyang
1 parent 1faf485d

修改审核

src/api/project/invoice.ts
... ... @@ -11,6 +11,7 @@ enum Api {
11 11 UPDATE_AMOUNT = '/order/erp/invoice_bill/update_amount_info', //更新其他金额信息
12 12 INVOICE_DELETE = '/order/erp/invoice_bill/delete_by_id', //删除数据
13 13 COMMIT = '/order/erp/invoice_bill/commit_apply', //提交审核
  14 + GETINVOICEDEDUCTURL_BY_ID = '/order/erp/invoice_bill/getDeductUrl_by_id', //获取扣款信息
14 15  
15 16 PRODUCT_CREATE = '/order/erp/check_bill/create', //创建生产科应付单据
16 17 PAYED_DATE = '/order/erp/check_bill/get_payed_date', //获取生产科应回款日期
... ... @@ -163,6 +164,13 @@ export const exportCheckAnalysis = async (params: any) => {
163 164 });
164 165 };
165 166  
  167 +export const getInvoiceDeductUrlById = async (params: any) => {
  168 + return await defHttp.post<any>({
  169 + url: Api.GETINVOICEDEDUCTURL_BY_ID,
  170 + params,
  171 + });
  172 +};
  173 +
166 174 export const getDeductUrlById = async (params: any) => {
167 175 return await defHttp.post<any>({
168 176 url: Api.GETDEDUCTURL_BY_ID,
... ...
src/views/project/approve/PayPanel.vue
... ... @@ -46,6 +46,7 @@
46 46 :showOkBtn="!isApproved && role === ROLE.ADMIN"
47 47 >
48 48 <Description
  49 + v-if="!mockData.invoiceName"
49 50 class="mt-4"
50 51 layout="vertical"
51 52 :collapseOptions="{ canExpand: true, helpMessage: 'help me' }"
... ... @@ -53,6 +54,13 @@
53 54 :data="mockData"
54 55 :schema="schema"
55 56 />
  57 + <a
  58 + v-if="mockData.invoiceName"
  59 + :href="mockData.invoiceUrl"
  60 + target="_blank"
  61 + rel="noopener noreferrer"
  62 + >{{ mockData.invoiceName }}</a
  63 + >
56 64 <template #appendFooter>
57 65 <a-button v-if="!isApproved && role === ROLE.ADMIN" @click="handleFalse"> 不通过</a-button>
58 66 </template>
... ... @@ -97,6 +105,7 @@
97 105 const fieldInfos = ref({});
98 106 const baseInfos = ref({});
99 107 const id = ref('');
  108 + const showInvoice = ref(false);
100 109  
101 110 const mockData = ref();
102 111 const actualPayCalculate = ref(0);
... ... @@ -154,9 +163,9 @@
154 163 customRender: (column) => {
155 164 const { record } = column || {};
156 165 if (record?.type === 40) {
157   - return '生产科应付款';
  166 + return '应付帐单申请';
158 167 } else if (record?.type == 50) {
159   - return '生产科发票';
  168 + return '生产科发票申请';
160 169 }
161 170 },
162 171 },
... ... @@ -166,8 +175,11 @@
166 175 width: 150,
167 176 customRender: (column) => {
168 177 const { record } = column || {};
169   - console.log(record, '56565repro');
170   - return record?.fieldInfos?.checkBillOrderDO?.deductDept;
  178 + if (record?.type === 40) {
  179 + return record?.fieldInfos?.checkBillOrderDO?.deductDept;
  180 + } else if (record?.type == 50) {
  181 + return record?.fieldInfos?.checkBillOrderDO?.productionName;
  182 + }
171 183 },
172 184 },
173 185 ];
... ... @@ -190,7 +202,7 @@
190 202  
191 203 const [registerTable, { reload }] = useTable({
192 204 api: props.isApproved ? getApprovedListApi : getWaitListApi,
193   - searchInfo: { type: 40 },
  205 + searchInfo: { type: 4050 },
194 206 // scroll: {
195 207 // scrollToFirstRowOnChange: true,
196 208 // },
... ... @@ -231,8 +243,18 @@
231 243 function handleProfitModal() {}
232 244  
233 245 async function handleDetail(data) {
  246 + if (data.type == 50) {
  247 + showInvoice.value = true;
  248 + }
234 249 openModal(true, { data });
235 250 mockData.value = data.fieldInfos.checkBillOrderDO;
  251 + const match = mockData.value.invoiceUrl.match(/aliyuncs\.com\/(.*?)\?/);
  252 + if (match && match[1]) {
  253 + // 对提取的部分进行解码
  254 + mockData.value.invoiceName = decodeURIComponent(match[1]);
  255 + } else {
  256 + mockData.value.invoiceName = mockData.value.invoiceUrl;
  257 + }
236 258 id.value = data.id;
237 259 }
238 260  
... ... @@ -289,6 +311,7 @@
289 311 handlePreview,
290 312 mockData,
291 313 schema,
  314 + showInvoice,
292 315 };
293 316 },
294 317 });
... ...
src/views/project/approve/ReceivePanel.vue
... ... @@ -140,7 +140,6 @@
140 140 dataIndex: 'invoiceNo',
141 141 width: 150,
142 142 customRender: (column) => {
143   - console.log(column, '5656coapprove');
144 143 const { record } = column || {};
145 144 return record?.fieldInfos?.invoiceBillOrderDO?.invoiceNo;
146 145 },
... ... @@ -226,7 +225,6 @@
226 225 async function handleDetail(data) {
227 226 openModal(true, { data });
228 227 mockData.value = data.fieldInfos.invoiceBillOrderDO;
229   - console.log(data, 5656777);
230 228 id.value = data.id;
231 229 }
232 230  
... ...
src/views/project/finance/pay/pay.data.tsx
... ... @@ -77,7 +77,7 @@ export const columns: BasicColumn[] = [
77 77 {
78 78 title: '生产科实际应付金额',
79 79 dataIndex: 'actualPayedAmount',
80   - width: 120,
  80 + width: 150,
81 81 },
82 82 {
83 83 title: '生产科发票上传',
... ... @@ -106,19 +106,16 @@ export const columns: BasicColumn[] = [
106 106 dataIndex: 'actualPayedAmount3',
107 107 width: 120,
108 108 },
109   - //需修改
110 109 {
111   - title: '生产科发票',
112   - dataIndex: 'invoiceStatus',
  110 + title: '生产科发票审核',
  111 + dataIndex: 'departmentInvoiceStatus',
113 112 width: 120,
114 113 customRender: (column) => {
115   - if (column.record.invoiceStatus == -1) {
116   - return '未提交审核';
117   - } else if (column.record.invoiceStatus == 0) {
  114 + if (column.record.departmentInvoiceStatus == 0) {
118 115 return '待审核';
119   - } else if (column.record.invoiceStatus == 1) {
  116 + } else if (column.record.departmentInvoiceStatus == 10) {
120 117 return '审核通过';
121   - } else if (column.record.invoiceStatus == 2) {
  118 + } else if (column.record.departmentInvoiceStatus == 20) {
122 119 return '审核驳回';
123 120 }
124 121 },
... ... @@ -132,9 +129,9 @@ export const columns: BasicColumn[] = [
132 129 return '未提交审核';
133 130 } else if (column.record.status == 0) {
134 131 return '待审核';
135   - } else if (column.record.status == 1) {
  132 + } else if (column.record.status == 10) {
136 133 return '审核通过';
137   - } else if (column.record.status == 2) {
  134 + } else if (column.record.status == 20) {
138 135 return '审核驳回';
139 136 }
140 137 },
... ...
src/views/project/finance/receive/DeductShow.vue 0 → 100644
  1 +<template>
  2 + <BasicModal
  3 + v-bind="$attrs"
  4 + @register="register"
  5 + title="扣款单"
  6 + width="700px"
  7 + :bodyStyle="{ height: '240px' }"
  8 + @ok="handleOk"
  9 + >
  10 + <a-list item-layout="horizontal" :data-source="itemArray">
  11 + <template #renderItem="{ item }">
  12 + <a-list-item>
  13 + <a-list-item-meta>
  14 + <template #title>
  15 + <a :href="item.url" target="_blank" rel="noopener noreferrer">{{ item.name }}</a>
  16 + </template>
  17 + </a-list-item-meta>
  18 + </a-list-item>
  19 + </template>
  20 + </a-list>
  21 + </BasicModal>
  22 +</template>
  23 +<script lang="ts" setup>
  24 + import { BasicModal, useModalInner } from '@/components/Modal';
  25 + import { computed, ref } from 'vue';
  26 + import type { UploadProps, UploadChangeParam } from 'ant-design-vue';
  27 + import { InboxOutlined } from '@ant-design/icons-vue';
  28 + import { message } from 'ant-design-vue';
  29 + import { getInvoiceDeductUrlById } from '@/api/project/invoice';
  30 +
  31 + interface Item {
  32 + name: string;
  33 + url: string;
  34 + }
  35 +
  36 + const list = ref();
  37 + const id = ref();
  38 + const itemArray = ref<Item[]>([]);
  39 +
  40 + const [register, { closeModal }] = useModalInner(async (data) => {
  41 + itemArray.value = [];
  42 + const res = await getInvoiceDeductUrlById({ id: data.data.id });
  43 + console.log(res, '5656resssdata');
  44 + for (let item in res) {
  45 + const url = res[item];
  46 + const name = item;
  47 + // 将 name 和 url 放入对象并添加到数组中
  48 + itemArray.value.push({ name, url });
  49 + }
  50 + });
  51 +
  52 + async function handleOk() {
  53 + itemArray.value = [];
  54 + closeModal();
  55 + }
  56 +</script>
... ...
src/views/project/finance/receive/index.vue
... ... @@ -12,6 +12,7 @@
12 12 <InvoiceAnalysis @register="registerInvoiceAnalysis" />
13 13 <TrackEdit @register="registerTrackEdit" @success="handleSuccess" />
14 14 <InvoiceDetail @register="registerInvoiceDetail" />
  15 + <DeductShow @register="registerDeductShow" />
15 16 </template>
16 17 <template #bodyCell="{ column, record }">
17 18 <template v-if="column.key === 'action'">
... ... @@ -39,6 +40,10 @@
39 40 label: '删除',
40 41 onClick: handleDelete.bind(null, record),
41 42 },
  43 + {
  44 + label: '扣款单',
  45 + onClick: handleDeductShow.bind(null, record),
  46 + },
42 47 ]"
43 48 />
44 49 </template>
... ... @@ -54,6 +59,7 @@
54 59 import TrackEdit from './TrackEdit.vue';
55 60 import InvoiceAnalysis from './InvoiceAnalysis.vue';
56 61 import InvoiceDetail from './InvoiceDetail.vue';
  62 + import DeductShow from './DeductShow.vue';
57 63 import { useDrawer } from '/@/components/Drawer';
58 64 import { getInvoice, deleteInvoice, commit, getBaseInvoice } from '@/api/project/invoice';
59 65 import { useModal } from '/@/components/Modal';
... ... @@ -68,6 +74,7 @@
68 74 const [registerFinanceEdit, { openDrawer: openFinanceEdit }] = useDrawer();
69 75 const [registerTrackEdit, { openDrawer: openTrackEdit }] = useDrawer();
70 76 const [registerInvoiceDetail, { openDrawer: openInvoiceDetail }] = useDrawer();
  77 + const [registerDeductShow, { openModal: openDeductShow }] = useModal();
71 78 const checkedKeys = ref<Array<string | number>>([]);
72 79 const userStore = useUserStoreWithOut();
73 80 const user = userStore.getUserInfo;
... ... @@ -214,6 +221,11 @@
214 221 reload();
215 222 }, 50);
216 223 }
  224 + function handleDeductShow(record) {
  225 + openDeductShow(true, {
  226 + data: record,
  227 + });
  228 + }
217 229 function handleCommit(record) {
218 230 commit({ id: record.id });
219 231 setTimeout(() => {
... ...
src/views/project/finance/receive/receive.data.tsx
... ... @@ -71,7 +71,8 @@ export const columns: BasicColumn[] = [
71 71 if (deductUrl == undefined) {
72 72 return;
73 73 }
74   - return <FilePptOutlined style="font-size:25px" onClick={() => window.open(deductUrl)} />;
  74 + // return <FilePptOutlined style="font-size:25px" onClick={() => window.open(deductUrl[0])} />;
  75 + return <FilePptOutlined style="font-size:25px" />;
75 76 },
76 77 },
77 78 {
... ... @@ -108,9 +109,9 @@ export const columns: BasicColumn[] = [
108 109 return '未提交审核';
109 110 } else if (column.record.status == 0) {
110 111 return '待审核';
111   - } else if (column.record.status == 1) {
  112 + } else if (column.record.status == 10) {
112 113 return '审核通过';
113   - } else if (column.record.status == 2) {
  114 + } else if (column.record.status == 20) {
114 115 return '审核驳回';
115 116 }
116 117 },
... ...
src/views/project/order/ExportModal.vue
... ... @@ -112,7 +112,13 @@
112 112 ];
113 113 }
114 114  
115   - // 质检不能导出任何
  115 + if (props.role === ROLE.INSPECT) {
  116 + return [
  117 + { label: '基本信息', value: 'baseFields' },
  118 + { label: '质检信息', value: 'inspectionStageFields' },
  119 + ];
  120 + }
  121 +
116 122 return [
117 123 { label: '基本信息', value: 'baseFields' },
118 124 { label: '质检信息', value: 'inspectionStageFields' },
... ...
src/views/project/order/ProductProfit.vue
... ... @@ -145,11 +145,15 @@
145 145 const projectNo = ref(); // 项目号
146 146 const projectStartTime = ref(); // 项目开发开始时间
147 147 const filteredItems = ref();
  148 + const ids = ref();
148 149  
149 150 const [register, { closeModal }] = useModalInner(async (data) => {
150 151 res.value = data.data;
151 152 customerCode.value = data.customerCode[0][0];
152   - projectNo.value = data.projectNo[0][0];
  153 + const extractedValues = ref<string[]>(data.projectNo.map((item) => item[0]));
  154 + projectNo.value = extractedValues.value;
  155 + ids.value = data.data;
  156 + console.log(data.projectNo, '5656projectNo');
153 157 console.log(Input2.value, 565656);
154 158 filteredItems.value = data.filteredItems;
155 159 });
... ... @@ -160,6 +164,7 @@
160 164 {
161 165 customerCode: customerCode.value,
162 166 projectNo: projectNo.value,
  167 + ids: ids.value,
163 168 projectStartTime: projectStartTime.value,
164 169 projectEndTime: projectEndTime.value,
165 170 productionDepartmentPredictPrice: productionDepartmentPredictPrice.value,
... ... @@ -206,6 +211,8 @@
206 211 projectEndTime.value = null;
207 212 productionDepartmentPredictPrice.value = null;
208 213 productionActualPrice.value = null;
  214 + projectNo.value = null;
  215 + ids.value = null;
209 216 }
210 217 }
211 218 function formatDateTime(dateTime: string): string {
... ... @@ -218,6 +225,7 @@
218 225 const res = await calculateInnerProfitRatio({
219 226 customerCode: customerCode.value,
220 227 projectNo: projectNo.value,
  228 + ids: ids.value,
221 229 projectStartTime: projectStartTime.value,
222 230 projectEndTime: projectEndTime.value,
223 231 productionDepartmentPredictPrice: productionDepartmentPredictPrice.value,
... ...
src/views/project/order/ServiceProfit.vue
... ... @@ -147,6 +147,20 @@
147 147 <td style="border: 1px solid black"></td>
148 148 </tr>
149 149 <tr>
  150 + <td style="border: 1px solid black" colspan="2">实际汇率</td>
  151 + <td style="border: 1px solid black"
  152 + ><a-input v-model:value="actualRatio" placeholder="请输入"
  153 + /></td>
  154 + <td style="border: 1px solid black"></td>
  155 + </tr>
  156 + <tr>
  157 + <td style="border: 1px solid black" colspan="2">实际跟单费用</td>
  158 + <td style="border: 1px solid black"
  159 + ><a-input v-model:value="actualdocumentaryPrice" placeholder="请输入"
  160 + /></td>
  161 + <td style="border: 1px solid black"></td>
  162 + </tr>
  163 + <tr>
150 164 <td style="border: 1px solid black" colspan="2">实际跟单单价=实际跟单费用/件数</td>
151 165 <td style="border: 1px solid black">{{ actualRmbPrice }}</td>
152 166 <td style="border: 1px solid black"></td>
... ... @@ -203,8 +217,9 @@
203 217 const chinaRatio = ref(0);
204 218 const actualRmbPrice = ref(0); //实际跟单单价
205 219 const actualPrice = ref(0); //实际跟单单价折算美金
206   - const actualRatio = ref(6.2); //实际汇率
  220 + const actualRatio = ref(); //实际汇率
207 221 const customerTotalPrice = ref(); //客户总价合计
  222 + const actualdocumentaryPrice = ref(); //实际跟单费用
208 223 const actualRatioProfitPrice = ref(); //汇率收益
209 224 const grossProfit = ref(); //毛利润合计
210 225 const actualRatiactualRatioProfitPriceo = ref(); //汇率收益计算
... ... @@ -218,6 +233,7 @@
218 233 const productionDepartmentTotalPrice = ref(); //生成科总价¥
219 234 const totalProfitPrice = ref(); //综合收益计算
220 235 const spainRatioProfitPrice = ref(); //西班牙提成金额
  236 + const ids = ref();
221 237  
222 238 // const orderRes = await getOrderList({});
223 239 // console.log(orderRes, '5656orderRes');
... ... @@ -225,7 +241,9 @@
225 241 res.value = data.data;
226 242 orderList.value = data.res;
227 243 customerCode.value = data.customerCode[0][0];
228   - projectNo.value = data.projectNo[0][0];
  244 + ids.value = data.data;
  245 + const extractedValues = ref<string[]>(data.projectNo.map((item) => item[0]));
  246 + projectNo.value = extractedValues.value;
229 247 console.log(orderList.value, 565656);
230 248 });
231 249 async function handleOk() {
... ... @@ -235,11 +253,13 @@
235 253 {
236 254 customerCode: customerCode.value,
237 255 projectNo: projectNo.value,
  256 + ids: ids.value,
238 257 projectStartTime: projectStartTime.value,
239 258 projectEndTime: projectEndTime.value,
240 259 produceStartTime: produceStartTime.value,
241 260 produceEndTime: produceEndTime.value,
242 261 developTotalPrice: developTotalPrice.value,
  262 + actualdocumentaryPrice: actualdocumentaryPrice.value,
243 263 copyTotalPrice: copyTotalPrice.value,
244 264 spainRatio: spainRatio.value,
245 265 chinaRatio: chinaRatio.value,
... ... @@ -291,7 +311,9 @@
291 311 produceEndTime.value = null;
292 312 customerCode.value = null;
293 313 projectNo.value = null;
  314 + ids.value = null;
294 315 developTotalPrice.value = null;
  316 + actualdocumentaryPrice.value = null;
295 317 copyTotalPrice.value = null;
296 318 packetActualTotalPrice.value = null;
297 319 }
... ... @@ -340,11 +362,13 @@
340 362 const params = {
341 363 customerCode: customerCode.value,
342 364 projectNo: projectNo.value,
  365 + ids: ids.value,
343 366 projectStartTime: projectStartTime.value,
344 367 projectEndTime: projectEndTime.value,
345 368 produceStartTime: produceStartTime.value,
346 369 produceEndTime: produceEndTime.value,
347 370 developTotalPrice: developTotalPrice.value,
  371 + actualdocumentaryPrice: actualdocumentaryPrice.value,
348 372 copyTotalPrice: copyTotalPrice.value,
349 373 spainRatio: spainRatio.value,
350 374 chinaRatio: chinaRatio.value,
... ... @@ -357,11 +381,13 @@
357 381 const res = await calculateBusinessProfit({
358 382 customerCode: customerCode.value,
359 383 projectNo: projectNo.value,
  384 + ids: ids.value,
360 385 projectStartTime: projectStartTime.value,
361 386 projectEndTime: projectEndTime.value,
362 387 produceStartTime: produceStartTime.value,
363 388 produceEndTime: produceEndTime.value,
364 389 developTotalPrice: developTotalPrice.value,
  390 + actualdocumentaryPrice: actualdocumentaryPrice.value,
365 391 copyTotalPrice: copyTotalPrice.value,
366 392 spainRatio: spainRatio.value,
367 393 chinaRatio: chinaRatio.value,
... ...
src/views/project/order/index.vue
... ... @@ -155,12 +155,14 @@
155 155 :style="{ borderRadius: '5px 5px 5px 5px' }"
156 156 type="primary"
157 157 @click="handleProductProfitModal"
  158 + v-if="role === ROLE.ADMIN || role === ROLE.FINANCE"
158 159 >内部生产净利润分析</a-button
159 160 >
160 161 <a-button
161 162 :style="{ borderRadius: '5px 5px 5px 5px' }"
162 163 type="primary"
163 164 @click="handleServiceProfitModal"
  165 + v-if="role === ROLE.ADMIN || role === ROLE.FINANCE"
164 166 >业务/研发净利润分析</a-button
165 167 >
166 168 <a-button
... ... @@ -177,7 +179,6 @@
177 179 v-if="role === ROLE.ADMIN"
178 180 >比重计算</a-button
179 181 >
180   - <!-- 质检角色不能导出任何信息 -->
181 182 <a-button
182 183 :style="{ borderRadius: '5px 5px 5px 5px' }"
183 184 type="primary"
... ... @@ -186,7 +187,8 @@
186 187 role === ROLE.ADMIN ||
187 188 role === ROLE.TRACKER ||
188 189 role === ROLE.BUSINESS ||
189   - role === ROLE.FINANCE
  190 + role === ROLE.FINANCE ||
  191 + role === ROLE.INSPECT
190 192 "
191 193 >导出</a-button
192 194 >
... ... @@ -990,10 +992,10 @@
990 992 error('勾选订单的客户编码需一致');
991 993 return;
992 994 }
993   - if (selectedProjectNos.value.length > 1) {
994   - error('勾选订单的项目号需一致');
995   - return;
996   - }
  995 + // if (selectedProjectNos.value.length > 1) {
  996 + // error('勾选订单的项目号需一致');
  997 + // return;
  998 + // }
997 999 const form = getForm();
998 1000 const values = form.getFieldsValue();
999 1001 const resAll = await getOrderList({});
... ...