Merge pull request 'master' (#277) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/277
@@ -19,3 +19,10 @@ export const getAllocationProcess = () => {
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
export const getAllocationDetailList = (params) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/cost/allocation/process',
|
||||
method: "get",
|
||||
params:params
|
||||
});
|
||||
};
|
||||
|
||||
10
src/api/project-manage/attachment.js
Normal file
@@ -0,0 +1,10 @@
|
||||
import request from '@/utils/request.js'
|
||||
|
||||
|
||||
export const searchFileList = (params) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/attachment/list`,
|
||||
method: "get",
|
||||
params: params
|
||||
});
|
||||
};
|
||||
@@ -91,11 +91,10 @@ export const addLedger = (data) => {
|
||||
});
|
||||
};
|
||||
|
||||
export const getTags = (params) => {
|
||||
export const getTags = (projectId) => {
|
||||
return request({
|
||||
url: '/workflow/mosr/project/implementation/option',
|
||||
method: "get",
|
||||
params:params
|
||||
url: `/workflow/mosr/attachment/option/${projectId}`,
|
||||
method: "get"
|
||||
});
|
||||
};
|
||||
//项目归档
|
||||
|
||||
@@ -38,3 +38,9 @@ export const resubmitFund= (data) => {
|
||||
data
|
||||
});
|
||||
};
|
||||
export const deleteFund = (id) => {
|
||||
return request({
|
||||
url: `/workflow/mosr/special/fund/${id}`,
|
||||
method: "delete"
|
||||
});
|
||||
};
|
||||
|
||||
1
src/assets/svg/account.svg
Normal file
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1717294999406" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10473" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><path d="M721.7 259.8h140l-196-196v140c0 31 25 56 56 56z" fill="#2c2c2c" p-id="10474"></path><path d="M469.7 749.8c0-146.7 119.3-266 266-266 45.6 0 88.5 11.5 126 31.8V301.8h-140c-54 0-98-44-98-98v-140h-490c-30.9 0-56 25.1-56 56v784c0 30.9 25.1 56 56 56H573c-62.7-48.7-103.3-124.6-103.3-210z m-252-426.5h308c15.5 0 28 12.5 28 28s-12.5 28-28 28h-308c-15.5 0-28-12.5-28-28s12.5-28 28-28z m98 424.1h-98c-15.5 0-28-12.5-28-28s12.5-28 28-28h98c15.5 0 28 12.5 28 28s-12.6 28-28 28z m56-184h-154c-15.5 0-28-12.5-28-28s12.5-28 28-28h154c15.5 0 28 12.5 28 28s-12.6 28-28 28z" fill="#2c2c2c" p-id="10475"></path><path d="M735.7 539.8c-116 0-210 94-210 210s94 210 210 210 210-94 210-210-94.1-210-210-210z m69.1 163.5c12.9 0 23.3 10.5 23.3 23.4 0 12.9-10.4 23.3-23.3 23.3h-46.6v23.3h46.6c12.9 0 23.3 10.4 23.3 23.3s-10.4 23.3-23.3 23.3h-46.6v46.7c0 12.9-10.4 23.3-23.3 23.3s-23.3-10.4-23.3-23.3v-46.7H665c-12.9 0-23.3-10.4-23.3-23.3s10.4-23.3 23.3-23.3h46.6V750H665c-12.9 0-23.3-10.4-23.3-23.3s10.4-23.3 23.3-23.3h37.3l-53.9-53.8c-9.1-9.1-9.1-23.9 0-33 9.1-9.1 23.9-9.1 33 0l53.4 53.3 55.5-53.6c9.2-8.9 24-8.7 33 0.6 9 9.2 8.7 24-0.6 33l-55.5 53.3h37.6z" fill="#2c2c2c" p-id="10476"></path></svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
1
src/assets/svg/fee.svg
Normal file
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1717295020643" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11515" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><path d="M683.604677 560.04317c-28.140302-46.866394-27.62866-47.68502-27.62866-47.685021s-97.007295 27.219346-115.017088-65.797142h-56.178275s-15.451584 93.118817-114.607775 65.592486c-28.651944 47.787349-29.675227 49.219946-29.675227 49.322274 0 0 77.564905 54.234036 0 127.808134l30.08454 49.526931s85.648846-36.940542 113.68682 63.955232h56.894573s17.805136-92.811832 114.198462-65.387829c27.424003-46.866394 27.833317-47.275707 27.833316-47.275707s-72.755471-62.829619 0.409314-130.059358zM511.590687 690.102528c-36.224243 0-65.592485-29.368242-65.592486-65.592485 0-36.224243 29.368242-65.592485 65.592486-65.592485 36.224243 0 65.592485 29.368242 65.592485 65.592485 0 36.224243-29.368242 65.592485-65.592485 65.592485z" fill="#2c2c2c" p-id="11516"></path><path d="M716.554412 255.718597c7.674628-12.791046 14.939942-25.684421 21.898271-38.168482 7.674628-14.121315 13.098031-24.865794 16.065554-31.210153C818.780454 77.462576 755.848506-1.22794 631.92885 35.81493c-12.381733 4.297792-30.903168 10.232837-52.903768 16.27021-13.405016 3.683821-26.912361 6.856001-40.522034 9.618867-15.349256 3.376836-31.005496 5.321075-46.764065 5.730389-11.767763 0-25.991406-1.534926-42.261617-4.40012-32.540422-6.242031-64.466873-15.04227-95.677026-26.093734C228.141101 0 166.437094 76.541621 230.187669 188.386529c2.455881 5.321075 8.80024 17.907465 17.805136 34.280004 9.107225 16.577196 18.930748 33.25672 29.265914 49.833917C116.296193 366.540222 9.874688 533.233137 9.874688 729.089637c0 47.889677 6.242031 95.063056 18.419106 140.701509 1.432597 9.925852 5.116419 22.409913 10.335166 34.075347l1.22794 3.479165 7.879285 22.61457h5.730388c30.596183 42.568602 83.090637 66.820426 146.431898 66.820426h625.32867c92.607175 0 159.836914-51.47117 170.888378-131.389628 11.870091-44.512841 17.702808-90.355951 17.60048-136.301389 0-209.159189-120.747477-386.187269-297.161587-473.37104zM930.727691 852.395323c-6.958329 48.810633-44.717498 77.564905-105.50055 77.564905H199.898471c-48.094334 0-82.476666-18.521435-98.030579-48.810633l-1.330268-2.353552-0.204657-0.818627c-3.274508-7.060658-5.423404-14.632957-6.651344-22.307585-11.153792-41.340662-16.884181-83.909264-16.98651-126.682522 0-183.372439 106.626162-337.78595 263.08624-414.327571l34.791646-16.884181-21.898271-31.824123c-23.637854-34.586989-44.717498-70.811232-63.341261-108.365744-34.893974-61.397022-22.716898-76.439292 43.591885-56.996902 9.925852 3.683821 29.368242 10.02818 52.699111 16.372539 17.907465 4.911762 35.303288 9.004897 51.880484 11.870091 19.851704 3.581493 37.963825 5.525732 54.131707 5.525732 17.293495 0 37.247527-2.455881 59.964425-6.958329 14.4283-2.865194 29.675227-6.549016 45.126811-10.846807 18.82842-5.116419 37.452183-10.846807 55.871291-17.293495 64.262216-19.135405 77.360248-3.069851 42.67093 55.564305-3.888478 7.879285-8.80024 17.702808-15.963226 30.698511-11.870091 21.898271-25.172779 44.512841-39.601079 66.615769L617.398221 286.519436l37.963826 15.144599C825.94344 369.507745 946.690916 533.130808 946.690916 728.987309c0 41.954632-5.525732 83.295293-15.963225 123.408014z m0 0" fill="#2c2c2c" p-id="11517"></path></svg>
|
||||
|
After Width: | Height: | Size: 3.4 KiB |
1
src/assets/svg/fee_share.svg
Normal file
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1717294973537" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9231" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><path d="M736.3 722.8c-15.9 0-31.5-0.6-46.6-1.8-5.4 19-12.7 37.8-23.7 54.3-9.1 18-21.6 33.8-36.2 47.9 32 5.6 68.5 8.8 106.5 8.8 119.6 0 223.7-31.2 223.7-72.8v-93.6c-46.8 31.2-124.8 57.2-223.7 57.2zM192.5 201.1c7.7 5.2 15.5 10.4 20.7 18.1 7.7 5.2 12.9 12.9 18.1 20.7 2.6 5.2 7.7 10.3 10.4 15.5 5.2 5.2 7.7 10.3 10.3 15.5 2.6 5.2 7.7 12.9 10.3 18.1h173.3c2.6-5.2 7.7-10.3 10.4-18.1 2.6-5.2 5.2-10.3 10.3-15.5 2.6-2.6 5.2-5.2 7.7-10.4 5.2-7.7 10.3-15.5 15.5-20.7 5.2-7.7 12.9-12.9 23.2-20.7 5.2-2.6 10.3-5.2 12.9-10.3 2.6-5.2 5.2-7.7 5.2-12.9s0-7.7-2.6-12.9-5.2-7.7-10.3-10.3c-5.2-2.6-10.3-2.6-12.9-2.6-2.6 0-7.7 2.6-10.4 2.6-2.6 0-7.7 2.6-10.3 5.2-2.6 2.6-7.7 2.6-12.9 2.6s-10.3 0-12.9-2.6c-2.6-2.6-7.7-5.2-10.4-7.7-2.6-2.6-5.2-5.2-10.3-7.7-2.6-2.6-7.7-5.2-12.9-7.7-10.3-5.2-20.7-5.2-25.9-2.6-7.7 2.6-12.9 7.7-20.7 12.9-5.2 5.2-10.3 10.4-12.9 10.4-2.6 0-2.6 2.6-5.2 2.6-2.6-2.6-5.2-2.6-10.3-5.2-2.6-2.6-5.2-2.6-7.7-5.2l-7.7-7.7c-2.6-2.6-10.3-5.2-18.1-7.7-7.7-2.6-15.5 0-23.2 5.2-10.3 5.2-15.5 10.3-20.7 15.5-5.2 5.2-10.3 7.7-18.1 7.7h-15.5c-2.6-2.6-7.7-2.6-12.9-5.2s-10.3-2.6-15.5-2.6c-5.2 0-10.3 0-12.9 2.6-7.7 5.2-10.4 12.9-7.7 23.2 2.2 7.6 7.4 12.7 12.6 17.9z m447.6 393.2c-5.2-28.4-10.3-51.7-20.7-72.4-10.3-20.7-23.2-38.8-36.2-54.3-12.9-15.5-28.4-28.4-41.4-41.4-15.5-12.9-31-25.9-41.4-38.8-10.4-12.9-23.2-23.2-31.1-31.1-10.3-10.3-18.1-20.7-25.9-28.4H257.1c-5.2 10.3-15.5 20.7-23.2 31.1-7.7 10.3-18.1 20.7-28.4 31-10.3 10.3-25.9 23.2-38.8 36.2-15.5 15.5-31 31-46.6 49.1-15.5 18.1-25.9 38.8-36.2 59.5-10.4 20.7-15.5 43.9-18.1 69.8-2.6 25.9-2.6 51.8 2.6 77.6 5.2 23.2 12.9 49.1 28.4 72.4 12.9 23.2 31 46.6 56.9 67.3s51.7 36.2 85.3 49.1c33.7 13 72.6 18.2 116.5 18.2 41.4 0 80.2-5.2 113.8-15.5 33.6-10.4 62.1-25.9 85.3-43.9 23.2-18.1 43.9-38.8 56.9-64.6 15.5-23.2 23.2-51.7 28.4-77.6 2.7-33.8 5.3-64.9 0.2-93.3zM430.5 697.8c15.5 0 23.2 5.2 23.2 18.1 0 5.2 0 10.3-5.2 12.9-2.6 2.6-7.7 2.6-12.9 2.6h-56.9v15.5c0 5.2-2.6 10.3-5.2 15.5-5.2 5.2-10.3 7.7-15.5 5.2-7.7 0-12.9-2.6-15.5-5.2-5.2-2.6-7.7-7.7-7.7-15.5v-15.5h-59.5c-5.2 0-10.3-2.6-12.9-5.2-2.6-2.6-5.2-7.7-5.2-10.3 0-5.2 2.6-7.7 5.2-12.9 2.6-2.6 7.7-5.2 12.9-5.2h57v-28.4h-56.9c-5.2 0-10.3-2.6-12.9-5.2-2.6-2.6-5.2-7.7-5.2-10.4 0-2.6 2.6-7.7 5.2-12.9 2.6-2.6 7.7-5.2 12.9-5.2h56.9v-18.1L303.7 589c-7.7-7.7-12.9-15.5-20.7-20.7l-10.4-12.8c-2.6-2.6-5.2-7.7-7.7-12.9s0-12.9 2.6-18.1c5.2-5.2 10.3-7.7 18.1-5.2 7.7 2.6 12.9 5.2 18.1 10.3 2.6 2.6 5.2 7.7 10.3 12.9l41.4 41.4c10.3-7.7 18.1-15.5 25.9-23.2 7.7-5.2 12.9-12.9 20.7-18.1s10.3-10.3 12.9-12.9c5.2-5.2 10.3-7.7 15.5-7.7s10.4 2.6 15.5 7.7c7.7 7.7 5.2 18.1-7.7 28.4l-15.5 15.6-46.6 46.6v12.9h54.3c7.7 0 12.9 2.6 18.1 5.2 5.2 2.6 5.2 7.7 5.2 12.9s-2.6 10.3-5.2 12.9c-2.6 2.6-7.7 5.2-15.5 5.2h-54.3v28.4h51.8zM736.3 556.4c-16.3 0-31.9-0.6-46.9-1.7 2.8 11.2 5.1 23.1 7.5 36 4.7 25.9 3.4 53.9 1.1 83.9 12.3 1 25.1 1.5 38.2 1.5 119.6 0 208.1-41.6 223.7-83.2v-93.6c-46.7 36.3-124.7 57.1-223.6 57.1zM736.3 337.9c-72.8 3.2-139.7 17.9-181 39.5 10.2 10.5 22.8 21 35.4 31.5 14 14 30.7 28 44.7 44.7 12.6 15 25 32.5 35.5 52 20.4 2.5 42.3 3.9 65.4 3.9 119.6 0 208.1-41.6 223.7-83.2 0-46.8-98.8-88.4-223.7-88.4z" fill="#2c2c2c" p-id="9232"></path></svg>
|
||||
|
After Width: | Height: | Size: 3.4 KiB |
1
src/assets/svg/filing.svg
Normal file
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1717295344332" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="22536" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><path d="M0 307.2h66.56l79.36 94.72H870.4L947.2 307.2h76.8v512c0 112.64-92.16 204.8-204.8 204.8H204.8c-112.64 0-204.8-92.16-204.8-204.8V307.2z m340.48 325.12V563.2c0-17.92-15.36-33.28-33.28-33.28s-33.28 15.36-33.28 33.28v102.4c0 17.92 15.36 33.28 33.28 33.28h427.52c17.92 0 33.28-15.36 33.28-33.28v-102.4c0-17.92-15.36-33.28-33.28-33.28s-33.28 15.36-33.28 33.28v69.12H340.48zM102.4 204.8h819.2v69.12L852.48 358.4h-680.96L102.4 273.92V204.8z m0-204.8h819.2v69.12L852.48 153.6h-680.96L102.4 69.12V0z" fill="#3B3B47" p-id="22537"></path></svg>
|
||||
|
After Width: | Height: | Size: 865 B |
1
src/assets/svg/home.svg
Normal file
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1717296104869" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6006" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><path d="M554.965333 101.248l406.954667 373.034667a34.133333 34.133333 0 0 1-23.04 59.306666l-40.277333-0.042666v298.666666a85.333333 85.333333 0 0 1-85.333334 85.333334h-597.333333a85.333333 85.333333 0 0 1-85.333333-85.333334v-298.666666h-40.234667a34.133333 34.133333 0 0 1-23.04-59.264l406.912-373.034667a59.733333 59.733333 0 0 1 80.725333 0zM312.448 591.36a42.666667 42.666667 0 0 0 0 60.330667 279.978667 279.978667 0 0 0 395.946667 0 42.666667 42.666667 0 0 0-60.330667-60.330667 194.645333 194.645333 0 0 1-275.242667 0 42.666667 42.666667 0 0 0-60.373333 0z" fill="#2c2c2c" p-id="6007"></path></svg>
|
||||
|
After Width: | Height: | Size: 933 B |
1
src/assets/svg/implementation.svg
Normal file
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1717295325359" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="21461" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><path d="M854.016 889.514667l-41.642667-43.690667c10.922667-11.605333 25.941333-18.432 41.642667-18.432 32.768 0 59.392-27.989333 59.392-62.122667V144.725333c0-34.133333-26.624-62.122667-59.392-62.122666H263.509333c-32.768 0-59.392 27.989333-59.392 62.122666v5.461334c0 17.066667-6.826667 32.768-17.066666 43.690666L145.408 150.186667v-5.461334C145.408 75.776 197.973333 20.48 263.509333 20.48h591.189334c65.536 0 118.101333 55.296 118.101333 124.245333v620.544c-0.682667 68.949333-53.248 124.245333-118.784 124.245334zM86.016 268.970667v620.544c0 34.133333 26.624 62.122667 59.392 62.122666h591.189333c32.768 0 59.392-27.989333 59.392-62.122666V268.970667c0-34.133333-26.624-62.122667-59.392-62.122667H145.408c-32.768 0-59.392 27.989333-59.392 62.122667z m649.898667-124.245334c65.536 0 118.101333 55.296 118.101333 124.245334v620.544c0 68.266667-53.248 124.245333-118.101333 124.245333H145.408c-65.536 0-118.101333-55.296-118.101333-124.245333V268.970667c0-68.266667 53.248-124.245333 118.101333-124.245334h590.506667z" p-id="21462" fill="#2c2c2c"></path><path d="M735.914667 1024H145.408c-70.997333 0-128.341333-60.074667-128.341333-134.485333V268.970667c0-70.314667 52.565333-129.024 118.784-133.802667 4.096-69.632 60.074667-124.928 127.658666-124.928h591.189334c70.997333 0 128.341333 60.074667 128.341333 134.485333v620.544c0 70.314667-52.565333 129.024-118.784 133.802667-4.778667 70.314667-60.757333 124.928-128.341333 124.928zM135.850667 154.965333c-55.296 4.778667-98.986667 53.930667-98.986667 113.322667v620.544c0 62.805333 48.469333 114.005333 107.861333 114.005333h591.189334c58.026667 0 105.813333-49.152 107.861333-109.909333L805.546667 853.333333v36.181334c0 39.594667-31.402667 72.362667-69.632 72.362666H145.408c-38.229333 0-69.632-32.768-69.632-72.362666V268.970667c0-39.594667 31.402667-72.362667 69.632-72.362667h30.72l-40.277333-41.642667z m9.557333 62.122667c-26.624 0-49.152 23.210667-49.152 51.882667v620.544c0 28.672 21.845333 51.882667 49.152 51.882666h591.189333c26.624 0 49.152-23.210667 49.152-51.882666V268.970667c0-28.672-21.845333-51.882667-49.152-51.882667H145.408z m718.848 619.861333v41.642667c54.613333-5.461333 97.621333-53.930667 97.621333-113.322667V144.725333c0-62.805333-48.469333-114.005333-107.861333-114.005333H263.509333c-55.978667 0-102.4 45.738667-107.178666 103.765333h38.912c4.778667-34.816 33.450667-62.122667 68.949333-62.122666h591.189333c38.229333 0 69.632 32.768 69.632 72.362666v620.544c-1.365333 36.181333-27.306667 66.901333-60.757333 71.68z m-36.864 9.557334l17.066667 17.749333v-25.258667c-6.826667 1.365333-12.288 4.096-17.066667 7.509334zM197.973333 196.608h537.941334c38.229333 0 69.632 32.768 69.632 72.362667v569.344c10.24-10.922667 23.893333-17.749333 38.912-20.48V268.970667c0-62.805333-48.469333-114.005333-107.861334-114.005334H214.357333c-0.682667 15.018667-6.826667 30.037333-16.384 41.642667z m17.749334-62.122667h520.874666c70.997333 0 128.341333 60.074667 128.341334 134.485334v547.498666c21.845333-4.778667 38.912-25.941333 38.912-50.517333v-621.226667c0-28.672-21.845333-51.882667-49.152-51.882666H263.509333c-23.893333 0-43.690667 17.749333-47.786666 41.642666z m-51.882667 20.48l21.845333 23.210667c4.096-6.826667 6.826667-15.018667 7.509334-23.210667H163.84z" fill="#2c2c2c" p-id="21463"></path><path d="M162.474667 289.450667h372.736c17.066667 0 30.72 13.653333 30.72 30.72s-13.653333 30.72-30.72 30.72H162.474667c-17.066667 0-30.72-13.653333-30.72-30.72s13.653333-30.72 30.72-30.72z m559.104 62.122666c-17.066667 0-30.72-13.653333-30.72-30.72s13.653333-30.72 30.72-30.72 30.72 13.653333 30.72 30.72-13.653333 30.72-30.72 30.72zM69.632 434.176h744.789333v62.122667H69.632v-62.122667z" p-id="21464" fill="#2c2c2c"></path><path d="M824.661333 506.538667H59.392V423.936h765.269333v82.602667z m-744.789333-20.48h724.309333v-41.642667H79.872v41.642667z m641.706667-124.245334c-22.528 0-40.96-18.432-40.96-40.96s18.432-40.96 40.96-40.96 40.96 18.432 40.96 40.96-18.432 40.96-40.96 40.96z m0-62.122666c-11.605333 0-20.48 9.557333-20.48 20.48 0 11.605333 9.557333 20.48 20.48 20.48 11.605333 0 20.48-9.557333 20.48-20.48 0-11.605333-8.874667-20.48-20.48-20.48zM535.210667 361.813333H162.474667c-22.528 0-40.96-18.432-40.96-40.96s18.432-40.96 40.96-40.96h372.736c22.528 0 40.96 18.432 40.96 40.96s-18.432 40.96-40.96 40.96z m-372.736-62.122666c-11.605333 0-20.48 9.557333-20.48 20.48 0 11.605333 9.557333 20.48 20.48 20.48h372.736c11.605333 0 20.48-9.557333 20.48-20.48 0-11.605333-9.557333-20.48-20.48-20.48H162.474667z" fill="#2c2c2c" p-id="21465"></path></svg>
|
||||
|
After Width: | Height: | Size: 4.7 KiB |
1
src/assets/svg/initiation.svg
Normal file
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1717295270657" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="16717" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><path d="M419.84 952.32c-10.24 0-15.36 0-25.6-5.12l-225.28-61.44c-46.08-15.36-76.8-61.44-61.44-107.52l168.96-640C286.72 92.16 337.92 61.44 384 76.8l230.4 56.32c46.08 10.24 76.8 61.44 61.44 107.52L506.88 885.76c-5.12 25.6-20.48 40.96-40.96 56.32-15.36 5.12-30.72 10.24-46.08 10.24z m-56.32-803.84h-5.12s-5.12 5.12-5.12 10.24l-174.08 640c0 5.12 0 15.36 10.24 15.36l225.28 61.44h10.24s5.12-5.12 5.12-10.24l174.08-640c0-5.12 0-15.36-10.24-15.36l-230.4-61.44c5.12 0 0 0 0 0z" p-id="16718"></path><path d="M604.16 168.96l-225.28-56.32c-25.6-10.24-56.32 5.12-61.44 35.84l-174.08 640c-5.12 25.6 10.24 56.32 35.84 61.44l225.28 61.44c25.6 5.12 56.32-10.24 61.44-35.84l174.08-640c5.12-30.72-10.24-56.32-35.84-66.56z m-128 348.16c-5.12 15.36-20.48 30.72-35.84 30.72h-10.24l-92.16-25.6c-20.48-5.12-35.84-25.6-25.6-51.2 5.12-15.36 20.48-30.72 35.84-30.72h10.24l92.16 25.6c20.48 10.24 30.72 30.72 25.6 51.2zM512 404.48c-5.12 15.36-20.48 25.6-35.84 25.6h-10.24l-97.28-25.6c-20.48-5.12-30.72-25.6-25.6-46.08 5.12-15.36 20.48-30.72 40.96-30.72h10.24l92.16 25.6c20.48 5.12 30.72 25.6 25.6 51.2z m240.64 532.48c-20.48 0-40.96-15.36-40.96-40.96V215.04c0-20.48 15.36-40.96 40.96-40.96s40.96 15.36 40.96 40.96V896c-5.12 25.6-20.48 40.96-40.96 40.96z m87.04-10.24c-5.12 0-15.36-5.12-15.36-15.36V209.92c0-5.12 5.12-15.36 15.36-15.36s15.36 5.12 15.36 15.36v701.44c-5.12 10.24-10.24 15.36-15.36 15.36z m40.96 0c-5.12 0-15.36-5.12-15.36-15.36V209.92c0-5.12 5.12-15.36 15.36-15.36S896 199.68 896 209.92v701.44c0 10.24-5.12 15.36-15.36 15.36z" p-id="16719"></path></svg>
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
1
src/assets/svg/project.svg
Normal file
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1717295208831" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="15626" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><path d="M179.28 124.787c21.504 0 35.84 14.357 35.84 35.86 0 21.505-14.336 35.86-35.84 35.86-21.524 0-35.86-14.355-35.86-35.86 0-21.503 14.336-35.86 35.86-35.86z m0 358.541c21.504 0 35.84 14.356 35.84 35.86 0 21.524-14.336 35.86-35.84 35.86-21.524 0-35.86-14.336-35.86-35.86 0-21.504 14.336-35.86 35.86-35.86z m0 358.56h143.4c21.525 0 35.86 14.337 35.86 35.84 0 21.525-14.335 35.86-35.86 35.86H179.3c-21.524 0-35.86-14.335-35.86-35.86 0-21.503 14.336-35.84 35.86-35.84z" fill="#2c2c2c" p-id="15627"></path><path d="M888.41 318.163H125.832c-55.678 0.341-85.073-26.102-84.731-81.76V103.745c0.34-55.677 20.82-87.843 76.498-88.204h293.728s6.927-0.261 14.557 0c15.32 0.562 19.195 10.561 19.355 18.512 0.362 17.267 0 8.634 0 26.905 0 2.149-0.803 21.223-22.327 21.745-13.653 0.341-278.187 1.285-278.187 1.285-26.764 0.341-34.133 13.694-34.514 34.495v96.637c0 25.179 7.57 34.656 34.534 34.515h724.691c29.676 0.16 34.676-22.367 34.515-34.535v-96.597c0.924-11.344-4.819-35.58-34.515-35.78 0 0-465.177 0.823-478.77 0-17.83-1.064-22.387-8.071-22.428-20.68-0.06-17.69-0.662-8.574 0-26.183 0.382-9.939-2.61-19.737 22.609-20.28 6.224-0.16 11.284 0 11.284 0H883.21c55.657 0.342 89.59 45.98 89.931 101.658v119.186c0.342 55.657-29.113 82.12-84.73 81.759z m0 351.372H125.832c-55.678 0.342-85.073-26.102-84.731-81.759V455.118c0.34-55.678 20.82-87.843 76.498-88.205h293.728s6.927-0.26 14.557 0c15.32 0.562 19.195 10.562 19.355 18.513 0.362 17.267 0 8.633 0 26.905 0 2.148-0.803 21.223-22.327 21.745-13.653 0.34-278.187 1.285-278.187 1.285-26.764 0.341-34.133 13.693-34.514 34.494v96.638c0 25.178 7.57 34.655 34.534 34.515h724.691c29.676 0.16 34.676-22.368 34.515-34.535v-96.618c0.924-11.344-4.819-35.579-34.515-35.78 0 0-465.177 0.824-478.77 0-17.83-1.064-22.387-8.07-22.428-20.68-0.06-17.69-0.662-8.574 0-26.182 0.382-9.94-2.61-19.738 22.609-20.28 6.224-0.16 11.284 0 11.284 0H883.21c55.657 0.342 89.59 45.98 89.931 101.657v119.186c0.342 55.657-29.113 82.12-84.73 81.76z m0 351.373H125.832c-55.678 0.341-85.073-26.102-84.731-81.76V806.49c0.34-55.677 20.82-87.843 76.498-88.204h293.728s6.927-0.261 14.557 0c15.32 0.562 19.195 10.561 19.355 18.512 0.362 17.268 0 8.634 0 26.905 0 2.149-0.803 21.223-22.327 21.745-13.653 0.341-278.187 1.285-278.187 1.285-26.764 0.342-34.133 13.694-34.514 34.495v96.637c0 25.179 7.57 34.656 34.534 34.515h724.691c29.676 0.16 34.676-22.367 34.515-34.535v-96.617c0.924-11.344-4.819-35.58-34.515-35.78 0 0-465.177 0.823-478.77 0-17.83-1.064-22.387-8.071-22.428-20.68-0.06-17.69-0.662-8.574 0-26.183 0.382-9.939-2.61-19.737 22.609-20.28 6.224-0.16 11.284 0 11.284 0H883.21c55.657 0.342 89.59 45.98 89.931 101.658v119.186c0.342 55.657-29.113 82.12-84.73 81.759z" fill="#2c2c2c" p-id="15628"></path></svg>
|
||||
|
After Width: | Height: | Size: 3.0 KiB |
1
src/assets/svg/project_requirement.svg
Normal file
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1717295421269" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="23541" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><path d="M918.112262 0.279019H282.088283c-57.896458 0-105.050681 43.805995-105.050681 97.656676v53.013624H60.965668C27.762398 150.949319 0.837057 177.874659 0.837057 211.077929v752.653951c0 33.20327 26.925341 60.12861 60.128611 60.12861h736.889373c33.20327 0 60.12861-26.925341 60.12861-60.12861v-33.900817h60.26812c57.896458 0 105.050681-43.805995 105.050681-97.656676V97.935695c-0.13951-53.850681-47.293733-97.656676-105.19019-97.656676zM734.378202 343.751499c0 20.089373-16.183106 36.27248-36.27248 36.272479h-417.133515c-20.089373 0-36.27248-16.183106-36.272479-36.272479s16.183106-36.27248 36.272479-36.27248h417.133515c20.089373 0 36.27248 16.183106 36.27248 36.27248z m0 251.814714c0 20.089373-16.183106 36.27248-36.27248 36.272479h-417.133515c-20.089373 0-36.27248-16.183106-36.272479-36.272479s16.183106-36.27248 36.272479-36.27248h417.133515c20.089373 0 36.27248 16.183106 36.27248 36.27248zM146.345504 879.607629c-20.089373 0-36.27248-16.183106-36.272479-36.272479s16.183106-36.27248 36.272479-36.27248 36.27248 16.183106 36.27248 36.27248c0 19.949864-16.183106 36.27248-36.27248 36.272479z m0-247.768937c-20.089373 0-36.27248-16.183106-36.272479-36.272479s16.183106-36.27248 36.272479-36.27248 36.27248 16.183106 36.27248 36.27248-16.183106 36.27248-36.27248 36.272479z m0-251.814714c-20.089373 0-36.27248-16.183106-36.272479-36.272479s16.183106-36.27248 36.272479-36.27248 36.27248 16.183106 36.27248 36.27248c0 19.949864-16.183106 36.27248-36.27248 36.272479z m551.760218 499.583651h-417.133515c-20.089373 0-36.27248-16.183106-36.272479-36.272479s16.183106-36.27248 36.272479-36.27248h417.133515c20.089373 0 36.27248 16.183106 36.27248 36.27248 0 19.949864-16.183106 36.27248-36.27248 36.272479z m252.512262-47.572752c0 13.671935-14.92752 25.111717-32.505722 25.111717h-60.26812V210.93842c0-33.20327-26.925341-60.12861-60.128611-60.128611H249.582561v-53.013624c0-13.671935 14.92752-25.111717 32.505722-25.111716H917.972752c17.578202 0 32.505722 11.579292 32.505722 25.111716v734.238692z" p-id="23542"></path></svg>
|
||||
|
After Width: | Height: | Size: 2.3 KiB |
1
src/assets/svg/requirement.svg
Normal file
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1717295441926" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="24673" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><path d="M834.021053 560.505263l-56.589474-56.589474c-10.778947-10.778947-26.947368-10.778947-37.726316 0l-245.221052 245.221053c-8.084211 40.421053-13.473684 80.842105-21.557895 118.568421 40.421053-5.389474 80.842105-13.473684 121.263158-21.557895l245.221052-245.221052c8.084211-8.084211 10.778947-21.557895 5.389474-29.642105-5.389474 0-8.084211-5.389474-10.778947-10.778948zM747.789474 673.684211c-10.778947 5.389474-24.252632 5.389474-32.336842-2.694737l-40.421053-40.421053c-5.389474-5.389474-8.084211-16.168421-8.084211-24.252632 2.694737-10.778947 8.084211-18.863158 18.863158-21.557894 10.778947-2.694737 18.863158 0 26.947369 5.389473l37.726316 37.726316c5.389474 5.389474 8.084211 8.084211 8.08421 16.168421 2.694737 10.778947-2.694737 21.557895-10.778947 29.642106z m59.28421-61.978948c-5.389474 8.084211-16.168421 10.778947-26.947368 10.778948-5.389474 0-10.778947-2.694737-16.168421-8.084211L726.231579 576.673684c-2.694737-2.694737-5.389474-8.084211-8.084211-13.473684-2.694737-13.473684 8.084211-29.642105 21.557895-32.336842 8.084211-2.694737 16.168421 0 24.252632 5.389474l32.336842 32.336842 10.778947 10.778947c8.084211 13.473684 8.084211 24.252632 0 32.336842z" p-id="24674"></path><path d="M993.010526 102.4c-5.389474-18.863158-13.473684-37.726316-24.252631-51.2C949.894737 26.947368 925.642105 10.778947 896 2.694737c-10.778947 0-21.557895-2.694737-32.336842-2.694737H146.863158C79.494737 8.084211 28.294737 61.978947 25.6 129.347368v762.610527c2.694737 64.673684 48.505263 118.568421 113.178947 129.347368 5.389474 2.694737 13.473684 2.694737 21.557895 2.694737h706.021053c8.084211 0 16.168421 0 21.557894-2.694737 53.894737-10.778947 97.010526-53.894737 107.789474-107.789474 2.694737-13.473684 2.694737-26.947368 2.694737-43.115789v-727.578947c-2.694737-13.473684-2.694737-26.947368-5.389474-40.421053zM243.873684 223.663158h530.863158c10.778947 0 18.863158 5.389474 24.252632 13.473684 2.694737 5.389474 5.389474 10.778947 5.389473 13.473684 0 13.473684-13.473684 26.947368-26.947368 26.947369H246.568421c-13.473684 0-26.947368-13.473684-26.947368-26.947369s10.778947-26.947368 24.252631-26.947368z m-18.863158 231.747368c5.389474-5.389474 8.084211-8.084211 16.168421-10.778947h296.421053c5.389474 0 10.778947 2.694737 16.168421 5.389474 13.473684 8.084211 16.168421 26.947368 8.084211 37.726315-5.389474 8.084211-13.473684 10.778947-24.252632 10.778948H246.568421c-5.389474 0-10.778947-2.694737-16.168421-5.389474-13.473684-8.084211-16.168421-26.947368-5.389474-37.726316z m164.378948 245.221053c-5.389474 8.084211-13.473684 13.473684-21.557895 13.473684H241.178947c-8.084211 0-16.168421-8.084211-18.863158-13.473684-2.694737-5.389474-2.694737-13.473684-2.694736-18.863158 2.694737-10.778947 13.473684-18.863158 24.252631-21.557895h121.263158c5.389474 0 8.084211 0 13.473684 2.694737 10.778947 8.084211 16.168421 24.252632 10.778948 37.726316z m487.747368-59.284211l-250.610526 250.610527c-5.389474 5.389474-13.473684 8.084211-21.557895 8.08421l-161.68421 26.947369c-13.473684 2.694737-26.947368-5.389474-29.642106-18.863158v-13.473684l29.642106-164.378948c0-5.389474 2.694737-10.778947 5.389473-13.473684 59.284211-59.284211 118.568421-118.568421 177.852632-180.547368l53.894737-53.894737c10.778947-13.473684 24.252632-24.252632 37.726315-32.336842 8.084211-5.389474 18.863158-8.084211 26.947369-8.084211 24.252632-2.694737 48.505263 5.389474 67.368421 21.557895l61.978947 61.978947c10.778947 10.778947 18.863158 21.557895 21.557895 35.031579 8.084211 32.336842 0 61.978947-18.863158 80.842105z" p-id="24675"></path></svg>
|
||||
|
After Width: | Height: | Size: 3.8 KiB |
1
src/assets/svg/special_fund.svg
Normal file
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1717295133873" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12684" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><path d="M568.917333 852.48h-277.703111a27.306667 27.306667 0 0 1-27.306666-27.221333 27.335111 27.335111 0 0 1 27.306666-27.278223h71.111111l99.555556-99.356444 0.824889-0.739556a27.818667 27.818667 0 0 1 3.925333-2.986666H158.606222a53.020444 53.020444 0 0 1-52.963555-52.963556V245.703111a53.020444 53.020444 0 0 1 52.963555-52.963555h659.911111a53.191111 53.191111 0 0 1 53.048889 52.963555v266.268445h-259.982222a42.666667 42.666667 0 0 0-42.666667 42.666666v140.060445H495.786667a20.906667 20.906667 0 0 1 4.664889 3.754666 4.835556 4.835556 0 0 1 1.109333 1.194667l67.384889 67.470222v85.333334z m-114.887111-349.866667v52.849778h52.878222V502.613333h79.274667v-52.849777h-79.274667v-26.396445h79.274667v-52.878222h-54.044444l41.728-42.012445-37.262223-37.262222-55.978666 55.978667-56.064-55.978667-37.546667 37.262222 42.012445 42.012445h-54.044445v52.878222h79.274667v26.396445h-79.274667v52.849777z" p-id="12685" fill="#2c2c2c"></path><path d="M909.482667 583.765333A43.150222 43.150222 0 0 0 866.161778 540.444444h-225.479111a43.150222 43.150222 0 0 0-43.320889 43.320889v226.247111A43.150222 43.150222 0 0 0 640.682667 853.333333h226.247111a43.150222 43.150222 0 0 0 43.320889-43.320889z m-81.464889 104.049778v0.369778a19.484444 19.484444 0 0 1-26.652445 0l-34.446222-33.336889v138.496a18.887111 18.887111 0 0 1-37.774222-0.369778v-139.235555l-35.157333 35.185777a18.602667 18.602667 0 0 1-25.912889-26.652444l65.422222-65.422222a18.488889 18.488889 0 0 1 12.970667-5.176889 19.000889 19.000889 0 0 1 12.600888 4.807111c0.369778 0.739556 1.109333 1.109333 1.479112 1.479111a0.369778 0.369778 0 0 0 0.369777 0.369778l0.369778 0.369778 66.275556 63.687111 0.369777 0.369778a17.664 17.664 0 0 1 0.085334 25.059555z" p-id="12686" fill="#2c2c2c"></path></svg>
|
||||
|
After Width: | Height: | Size: 2.0 KiB |
1
src/assets/svg/summary.svg
Normal file
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1717295457045" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="25716" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><path d="M170.666667 34.133333h659.911111c34.133333 0 68.266667 17.066667 96.711111 39.822223 22.755556 22.755556 34.133333 51.2 34.133333 85.333333V534.755556c-5.688889 11.377778-22.755556 17.066667-34.133333 11.377777-45.511111-22.755556-91.022222-28.444444-142.222222-28.444444-39.822222 0-79.644444 11.377778-119.466667 34.133333-56.888889 34.133333-102.4 85.333333-125.155556 147.911111-22.755556 68.266667-22.755556 142.222222 5.688889 210.488889 5.688889 17.066667 11.377778 28.444444 22.755556 39.822222l5.688889 5.688889c5.688889 5.688889 5.688889 17.066667 0 22.755556-5.688889 5.688889-11.377778 11.377778-22.755556 11.377778H170.666667c-34.133333 0-62.577778-11.377778-85.333334-39.822223-22.755556-22.755556-39.822222-56.888889-34.133333-91.022222V153.6c0-28.444444 5.688889-51.2 22.755556-73.955556 17.066667-28.444444 51.2-51.2 85.333333-56.888888 0 11.377778 5.688889 11.377778 11.377778 11.377777z m73.955555 210.488889c-11.377778 0-17.066667 11.377778-17.066666 17.066667 0 5.688889 0 17.066667 5.688888 22.755555 5.688889 5.688889 11.377778 5.688889 17.066667 5.688889h506.311111c11.377778-5.688889 17.066667-17.066667 17.066667-28.444444s-11.377778-22.755556-22.755556-22.755556H250.311111c0 5.688889-5.688889 5.688889-5.688889 5.688889m5.688889 204.8c-5.688889 0-11.377778 5.688889-17.066667 11.377778-5.688889 11.377778-5.688889 22.755556 0 28.444444 5.688889 5.688889 11.377778 11.377778 17.066667 11.377778h273.066667c5.688889 0 17.066667-5.688889 22.755555-11.377778 5.688889-5.688889 5.688889-17.066667 0-28.444444-5.688889-5.688889-11.377778-11.377778-22.755555-11.377778H250.311111z" fill="#2c2c2c" p-id="25717"></path><path d="M625.777778 989.866667c-11.377778-5.688889-28.444444-11.377778-45.511111-17.066667 17.066667-39.822222 28.444444-73.955556 39.822222-113.777778l45.511111 17.066667c-11.377778 45.511111-22.755556 85.333333-39.822222 113.777778z m5.688889-159.288889v-170.666667h79.644444l-34.133333-51.2 56.888889-17.066667c17.066667 17.066667 28.444444 39.822222 45.511111 62.577778l-17.066667 5.688889h62.577778c17.066667-28.444444 34.133333-51.2 39.822222-68.266667l56.888889 17.066667c-11.377778 17.066667-22.755556 34.133333-39.822222 51.2h79.644444v170.666667h-159.288889c5.688889 5.688889 22.755556 28.444444 51.2 62.577778l-45.511111 34.133333c-17.066667-28.444444-34.133333-51.2-51.2-68.266667l39.822222-28.444444h-164.977777z m56.888889-125.155556v73.955556h216.177777v-73.955556h-216.177777z m56.888888 307.2c-22.755556 0-34.133333-5.688889-45.511111-17.066666-11.377778-11.377778-17.066667-28.444444-17.066666-51.2v-85.333334h51.2v73.955556c0 22.755556 11.377778 34.133333 34.133333 28.444444h56.888889c11.377778 0 22.755556 0 28.444444-5.688889 5.688889-5.688889 11.377778-11.377778 11.377778-17.066666 0-11.377778 5.688889-22.755556 5.688889-39.822223l51.2 17.066667c-5.688889 28.444444-11.377778 45.511111-11.377778 56.888889-5.688889 17.066667-11.377778 22.755556-22.755555 34.133333-11.377778 5.688889-28.444444 11.377778-45.511111 11.377778h-96.711112z m216.177778-34.133333c-22.755556-39.822222-39.822222-73.955556-56.888889-102.4l45.511111-22.755556c22.755556 39.822222 45.511111 73.955556 62.577778 102.4l-51.2 22.755556z" fill="#2c2c2c" p-id="25718"></path></svg>
|
||||
|
After Width: | Height: | Size: 3.5 KiB |
@@ -10,7 +10,8 @@
|
||||
<el-button type="danger" link @click="deleteOtherFile(singleFile,1)">删除</el-button>
|
||||
</template>
|
||||
<template v-else-if="!preview||JSON.stringify(singleFile) === '{}'||singleFile==null">
|
||||
<file-upload @getFile="getAttachment" :showFileList="showFileList" :multiple="false" :maxSize="1" :disabled="isSingleFile" @delete="deleteAttachment"/>
|
||||
<file-upload @getFile="getAttachment" :showFileList="showFileList" :multiple="false" :maxSize="1"
|
||||
:disabled="isSingleFile" @delete="deleteAttachment"/>
|
||||
</template>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
@@ -18,7 +19,7 @@
|
||||
<el-form-item label="其他文件">
|
||||
<el-card style="width: 100%">
|
||||
<file-upload @getFile="getOtherFile"/>
|
||||
<fvTable style="width: 100%;max-height: 250px;height: 250px" v-if="showTable" :tableConfig="tableConfig"
|
||||
<fvTable style="width: 100%;max-height: 300px;" v-if="showTable" :tableConfig="tableConfig"
|
||||
:data="allFileList" :isSettingCol="false" :pagination="false">
|
||||
<template #empty>
|
||||
<el-empty :image-size="90" description="暂无数据" style="padding: 0"/>
|
||||
@@ -69,15 +70,28 @@ const tableConfig = reactive({
|
||||
align: 'center',
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => {
|
||||
let btn = []
|
||||
btn.push({label: '下载', func: () => handleDownload(row), type: 'primary'})
|
||||
if (row.newFile){
|
||||
btn.push({label: '删除', func: () => handleDelete(row), type: 'primary'})
|
||||
}
|
||||
return (
|
||||
<div>
|
||||
<el-button type="primary" link onClick={() => handleDownload(row)}>下载</el-button>
|
||||
<div style={{width: '100%'}}>
|
||||
{
|
||||
btn.map(item => (
|
||||
<el-button
|
||||
type={item.type}
|
||||
onClick={() => item.func()}
|
||||
link
|
||||
>
|
||||
{item.label}
|
||||
</el-button>
|
||||
))
|
||||
}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
// <el-button type="primary" size="large" link onClick={() => deleteOtherFile(row)}>删除</el-button>
|
||||
]
|
||||
})
|
||||
const rules = reactive({
|
||||
@@ -91,19 +105,24 @@ const props = defineProps({
|
||||
showFileList: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}, label: {
|
||||
},
|
||||
label: {
|
||||
type: String,
|
||||
default: '项目附件'
|
||||
}, showTable: {
|
||||
},
|
||||
showTable: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
}, preview: {
|
||||
},
|
||||
preview: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}, otherFileList: {
|
||||
},
|
||||
otherFileList: {
|
||||
type: Array,
|
||||
default: []
|
||||
}, formData: {
|
||||
},
|
||||
formData: {
|
||||
type: Array,
|
||||
default: []
|
||||
}
|
||||
@@ -112,34 +131,34 @@ watch(() => props.showTable, (newVal) => {
|
||||
props.showTable = newVal
|
||||
}, {deep: true})
|
||||
watch(() => props.otherFileList, (newVal) => {
|
||||
console.log('newotherFileList',newVal)
|
||||
console.log('newotherFileList', newVal)
|
||||
if (props.preview) {
|
||||
if(props.formData.fileList==null){
|
||||
allFileList.value=newVal
|
||||
}else {
|
||||
if (props.formData.fileList == null) {
|
||||
allFileList.value = newVal
|
||||
} else {
|
||||
newVal?.forEach(item => {
|
||||
allFileList.value.push(item)
|
||||
})
|
||||
}
|
||||
|
||||
}else {
|
||||
allFileList.value=newVal
|
||||
} else {
|
||||
allFileList.value = newVal
|
||||
}
|
||||
}, {deep: true})
|
||||
watch(() => props.formData.fileList, (newVal) => {
|
||||
console.log('newVal-fileList',newVal)
|
||||
console.log('newVal-fileList', newVal)
|
||||
if (props.preview) {
|
||||
newVal?.forEach(item => {
|
||||
allFileList.value.push(item)
|
||||
})
|
||||
newVal?.forEach(item => {
|
||||
allFileList.value.push(item)
|
||||
})
|
||||
}
|
||||
}, {deep: true})
|
||||
watch(() => props.formData.singleFile, (newVal) => {
|
||||
console.log('singleFile',newVal)
|
||||
console.log('singleFile', newVal)
|
||||
singleFile.value = newVal
|
||||
}, {deep: true})
|
||||
const getAttachment = (val) => {
|
||||
isSingleFile.value=true
|
||||
isSingleFile.value = true
|
||||
emit('getAttachment', val)
|
||||
}
|
||||
const getOtherFile = (val) => {
|
||||
@@ -150,10 +169,10 @@ const deleteAttachment = (val) => {
|
||||
if (res.code === 1000) {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message:"删除成功",
|
||||
type:'success'
|
||||
message: "删除成功",
|
||||
type: 'success'
|
||||
})
|
||||
isSingleFile.value=false
|
||||
isSingleFile.value = false
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -207,5 +226,7 @@ defineExpose({
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
:deep(.el-table--fit ){
|
||||
height: 300px!important;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,20 +1,10 @@
|
||||
<template>
|
||||
<div v-loading="loading">
|
||||
<fvForm :schema="schema" @getInstance="(e)=>form = e"></fvForm>
|
||||
<!-- <AttachmentUpload></AttachmentUpload> -->
|
||||
<el-form :model="formData" label-width="auto">
|
||||
<el-form-item label="其他文件">
|
||||
<el-table :data="formData.fileList" style="width: 100%">
|
||||
<el-table-column label="序号" type="index" width="80"></el-table-column>
|
||||
<el-table-column label="文件名称" prop="originalFileName"></el-table-column>
|
||||
<el-table-column label="标签" prop="tag"></el-table-column>
|
||||
<el-table-column label="文件大小" prop="size">
|
||||
<template #default="{row}">
|
||||
{{ parseInt(row.size / 1024) + 'KB' }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</el-form-item>
|
||||
<el-form :model="formData" label-width="auto" >
|
||||
<file-component title="需求上报附件" tag="需求上报"
|
||||
v-model:value="formData.fileList" :processViewer="processViewer"
|
||||
:file-list-show="fileListShow"/>
|
||||
</el-form>
|
||||
<div class="approval-record">
|
||||
<baseTitle title="审批记录"></baseTitle>
|
||||
@@ -24,19 +14,15 @@
|
||||
<process-diagram-viewer v-if="processViewer" :id-name="type"/>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <Opinion: v-if="data.taskId" :formData="formData" :taskId="formData.taskId"></Opinion:>-->
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
import { computed, markRaw, reactive, ref, watchEffect } from 'vue';
|
||||
import AttachmentUpload from '../AttachmentUpload.vue';
|
||||
import OperationRender from '@/views/workflow/common/OperationRender.vue'
|
||||
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue';
|
||||
import Opinion from './Opinion.vue';
|
||||
import fvTable from '@/fvcomponents/fvTable/index.vue'
|
||||
import { ElLoading } from 'element-plus';
|
||||
import {deleteFile, downloadFile} from "@/api/project-demand";
|
||||
import {downloadFile} from "@/api/project-demand";
|
||||
|
||||
const props = defineProps({
|
||||
formData: {
|
||||
@@ -55,12 +41,16 @@ const props = defineProps({
|
||||
type: Array,
|
||||
default: []
|
||||
},
|
||||
|
||||
fileListShow: {
|
||||
type: String,
|
||||
default: 'READ'
|
||||
},
|
||||
// approval 立项, execute 实施, 归档 archivist
|
||||
type: {
|
||||
type: String,
|
||||
default: 'approval'
|
||||
}, loading: {
|
||||
},
|
||||
loading: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
|
||||
@@ -1,70 +1,15 @@
|
||||
<template>
|
||||
<div v-loading="loading">
|
||||
<el-form :model="formData" ref="form" class="query-form" label-width="auto">
|
||||
<el-row>
|
||||
<!-- <el-col :span="12">-->
|
||||
<!-- <el-form-item label="分摊名称">-->
|
||||
<!-- <span>{{ formData.shareName }}</span>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- </el-col>-->
|
||||
<!-- <el-col :span="12">-->
|
||||
<!-- <el-form-item label="分摊月份">-->
|
||||
<!-- <span>{{ formData.apportionmentMonth }}</span>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- </el-col>-->
|
||||
<el-col :span="24">
|
||||
<el-form-item>
|
||||
<fvSearchForm :searchConfig="searchConfig" @search="search"></fvSearchForm>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item>
|
||||
<el-table :data="formData.usrAllocationList" style="width: 100%">
|
||||
<el-table-column prop="projectId" label="项目名称" width="180"/>
|
||||
<el-table-column prop="researchPersonnel" label="研发人员" width="180"/>
|
||||
<el-table-column prop="wagesPayable" label="应发工资"/>
|
||||
<el-table-column prop="performance" label="绩效"/>
|
||||
<el-table-column prop="reserveFund" label="公积金"/>
|
||||
<el-table-column prop="socialSecurity" label="社保"/>
|
||||
<el-table-column prop="annuity" label="年金"/>
|
||||
<el-table-column prop="workday" label="工作日(天)"/>
|
||||
<el-table-column prop="researchDuration" label="研发时长(天)"/>
|
||||
</el-table>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<div v-if="formData.taskId">
|
||||
<baseTitle title="审核意见"></baseTitle>
|
||||
<el-form-item prop="auditOpinion">
|
||||
<el-input
|
||||
v-model="formData.auditOpinion"
|
||||
:rows="3"
|
||||
type="textarea"
|
||||
placeholder="请输入审核意见"
|
||||
/>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
|
||||
<div class="approval-record">
|
||||
<baseTitle title="审批记录"></baseTitle>
|
||||
<div class="process">
|
||||
<operation-render v-if="processViewer" :operation-list="data.operationList"
|
||||
:state="data.state"/>
|
||||
<process-diagram-viewer v-if="processViewer" id-name="collectionProcess"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<opinion v-if="data.taskId" :formData="data.formData" :taskId="data.taskId"></opinion>
|
||||
<fvSearchForm :searchConfig="searchConfig" @search="search"></fvSearchForm>
|
||||
<fvTable ref="tableIns" :tableConfig="tableConfig" :data="detailList" style="width: 100%">
|
||||
<template #empty>
|
||||
<el-empty description="暂无数据"/>
|
||||
</template>
|
||||
</fvTable>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
import OperationRender from '@/views/workflow/common/OperationRender.vue'
|
||||
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue'
|
||||
|
||||
const searchConfig = reactive([
|
||||
{
|
||||
label: '项目名称',
|
||||
@@ -99,21 +44,61 @@ const searchConfig = reactive([
|
||||
colProps: {}
|
||||
},
|
||||
])
|
||||
const tableConfig = reactive({
|
||||
columns: [
|
||||
{
|
||||
prop: 'projectName',
|
||||
label: '项目名称',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
prop: 'researchPersonnel',
|
||||
label: '研发人员',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
prop: 'wagesPayable',
|
||||
label: '应发工资',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
prop: 'performance',
|
||||
label: '绩效',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
prop: 'reserveFund',
|
||||
label: '公积金',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
prop: 'socialSecurity',
|
||||
label: '社保',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
prop: 'annuity',
|
||||
label: '年金',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
prop: 'workday',
|
||||
label: '工作日(天)',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
prop: 'researchDuration',
|
||||
label: '研发时长(天)',
|
||||
align: 'center'
|
||||
},
|
||||
]
|
||||
})
|
||||
const tableIns = ref()
|
||||
const tableData = ref([])
|
||||
const props = defineProps({
|
||||
formData: {
|
||||
detailList: {
|
||||
type: Array,
|
||||
default: []
|
||||
},
|
||||
data: {
|
||||
type: Array,
|
||||
default: []
|
||||
},
|
||||
processViewer: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
loading: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
@@ -121,7 +106,7 @@ const props = defineProps({
|
||||
})
|
||||
const search = (val) => {
|
||||
tableConfig.params = {...val}
|
||||
// tableIns.value.refresh()
|
||||
tableIns.value.refresh()
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
155
src/components/DetailComponent/FileComponent.vue
Normal file
@@ -0,0 +1,155 @@
|
||||
<template>
|
||||
<el-form-item label="需求上报附件" v-if="fileListShow === 'READ' || fileListShow === 'EDIT'">
|
||||
<file-upload @getFile="getOtherFile" v-if="fileListShow === 'EDIT'"/>
|
||||
<fvTable style="width: 100%;max-height: 400px;" v-if="processViewer" :tableConfig="tableConfig"
|
||||
:data="_value" :isSettingCol="false" :pagination="false">
|
||||
<template #empty>
|
||||
<el-empty :image-size="90" description="暂无数据" style="padding: 0"/>
|
||||
</template>
|
||||
</fvTable>
|
||||
</el-form-item>
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
|
||||
import {downloadFile, deleteFile} from "@/api/project-demand";
|
||||
import {ElMessage, ElMessageBox} from "element-plus";
|
||||
|
||||
|
||||
const props = defineProps({
|
||||
title: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
tag: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
fileListShow: {
|
||||
type: String,
|
||||
default: 'READ'
|
||||
},
|
||||
value: {
|
||||
type: Array,
|
||||
default: []
|
||||
},
|
||||
processViewer: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
})
|
||||
|
||||
|
||||
|
||||
const tableConfig = reactive({
|
||||
columns: [
|
||||
{
|
||||
prop: 'index',
|
||||
type: 'index',
|
||||
label: '序号',
|
||||
align: 'center',
|
||||
width: '80',
|
||||
},
|
||||
{
|
||||
prop: 'originalFileName',
|
||||
label: '文件名',
|
||||
align: 'center',
|
||||
},
|
||||
{
|
||||
prop: 'tag',
|
||||
label: '标签',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
prop: 'size',
|
||||
label: '文件大小',
|
||||
align: 'center',
|
||||
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
|
||||
},
|
||||
{
|
||||
prop: 'oper',
|
||||
label: '操作',
|
||||
align: 'center',
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => {
|
||||
let btn = []
|
||||
btn.push({label: '下载', func: () => handleDownload(row), type: 'primary'})
|
||||
if (row.newFile) {
|
||||
btn.push({label: '删除', func: () => handleDelete(row), type: 'primary'})
|
||||
}
|
||||
return (
|
||||
<div style={{width: '100%'}}>
|
||||
{
|
||||
btn.map(item => (
|
||||
<el-button
|
||||
type={item.type}
|
||||
onClick={() => item.func()}
|
||||
link>
|
||||
{item.label}
|
||||
</el-button>
|
||||
))
|
||||
}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
||||
]
|
||||
})
|
||||
|
||||
const _value = computed({
|
||||
get() {
|
||||
return props.value;
|
||||
},
|
||||
set(val) {
|
||||
emit("update:value", val);
|
||||
}
|
||||
})
|
||||
|
||||
const getOtherFile = (val) => {
|
||||
props.processViewer = false
|
||||
let fileObj = compositeParam(val)
|
||||
_value.value.push(fileObj)
|
||||
nextTick(() => {
|
||||
props.processViewer = true
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
const compositeParam = (item, type) => {
|
||||
return {
|
||||
fileId: item.id,
|
||||
size: item.size,
|
||||
originalFileName: item.originalFilename,
|
||||
fileType: item.fileType,
|
||||
url: item.url,
|
||||
newFile: true,
|
||||
tag: '需求上报'
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const handleDelete = (row) => {
|
||||
ElMessageBox.confirm(`确认删除名称为${row.originalFileName}的表格吗?`, '系统提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}).then(() => {
|
||||
deleteFile(row.fileId).then(res => {
|
||||
if (res.code === 1000) {
|
||||
ElMessage.success("删除成功");
|
||||
_value.splice(_value.findIndex((item) => item.id === row.fileId), 1);
|
||||
}
|
||||
});
|
||||
}).catch(() => {
|
||||
ElMessage.warning("用户取消删除! ");
|
||||
})
|
||||
}
|
||||
|
||||
watch(() => props.processViewer, (newVal) => {
|
||||
props.processViewer = newVal
|
||||
}, {deep: true})
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
||||
@@ -11,6 +11,9 @@
|
||||
import {ElNotification} from 'element-plus';
|
||||
import {agreeTask, rejectTask} from "@/api/project-demand/index.js";
|
||||
|
||||
import {useTagsView} from '@/stores/tagsview.js'
|
||||
|
||||
const tagsViewStore = useTagsView()
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
const props = defineProps({
|
||||
@@ -51,22 +54,42 @@ const back = () => {
|
||||
router.push({name: 'Filing'})
|
||||
break;
|
||||
case 'Implementation/detail':
|
||||
if (route.query.step === '20') {
|
||||
router.push({name: 'Initiation'})
|
||||
} else if (route.query.step === '40') {
|
||||
router.push({name: 'Implementation'})
|
||||
} else if (route.query.step === '50') {
|
||||
router.push({name: 'Filing'})
|
||||
if (route.query.source === 'home') {
|
||||
router.push('/home')
|
||||
} else {
|
||||
if (route.query.step === '10') {
|
||||
router.push({name: 'Summary'})
|
||||
} else if (route.query.step === '20') {
|
||||
router.push({name: 'Initiation'})
|
||||
} else if (route.query.step === '40') {
|
||||
router.push({name: 'Implementation'})
|
||||
} else if (route.query.step === '50') {
|
||||
router.push({name: 'Filing'})
|
||||
} else if (route.query.step === '00') {
|
||||
router.push({name: 'Requirement'})
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'Summary/detail':
|
||||
router.push({name: 'Summary'})
|
||||
if (route.query.source === 'home') {
|
||||
router.push('/home')
|
||||
} else {
|
||||
router.push({name: 'Summary'})
|
||||
}
|
||||
break;
|
||||
case 'Requirement/detail':
|
||||
router.push({name: 'Requirement'})
|
||||
if (route.query.source === 'home') {
|
||||
router.push('/home')
|
||||
} else {
|
||||
router.push({name: 'Requirement'})
|
||||
}
|
||||
break;
|
||||
case 'Fund/detail':
|
||||
router.push({name: 'Fund'})
|
||||
if (route.query.source === 'home') {
|
||||
router.push('/home')
|
||||
} else {
|
||||
router.push({name: 'Fund'})
|
||||
}
|
||||
break;
|
||||
case 'Share/detail':
|
||||
router.push({name: 'Expense/share'})
|
||||
@@ -84,7 +107,6 @@ const handleReject = async () => {
|
||||
})
|
||||
return
|
||||
}
|
||||
console.log('values', values)
|
||||
const params = {
|
||||
taskId: props.taskId,
|
||||
...values
|
||||
@@ -95,6 +117,7 @@ const handleReject = async () => {
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
||||
back()
|
||||
}
|
||||
|
||||
@@ -111,6 +134,7 @@ const handleAgree = async () => {
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
||||
back()
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
<baseTitle title="关联项目"></baseTitle>
|
||||
<el-col :span="24">
|
||||
<el-form-item>
|
||||
<fvTable style="width: 100%;max-height: 200px" v-if="showTable" :tableConfig="projectTable"
|
||||
<fvTable style="width: 100%;max-height:300px" v-if="showTable" :tableConfig="projectTable"
|
||||
:data="formData.projects" :isSettingCol="false" :pagination="false">
|
||||
<template #empty>
|
||||
<el-empty :image-size="90" description="暂无数据" style="padding: 0"/>
|
||||
@@ -41,7 +41,7 @@
|
||||
<baseTitle title="附件列表"></baseTitle>
|
||||
<el-col :span="24">
|
||||
<el-form-item>
|
||||
<fvTable style="width: 100%;max-height: 200px" v-if="showTable" :tableConfig="fileTable"
|
||||
<fvTable style="width: 100%;max-height: 300px;" v-if="showTable" :tableConfig="fileTable"
|
||||
:data="formData.files" :isSettingCol="false" :pagination="false">
|
||||
<template #empty>
|
||||
<el-empty :image-size="90" description="暂无数据" style="padding: 0"/>
|
||||
@@ -201,6 +201,8 @@ watch(() => props.showTable, (newVal) => {
|
||||
}, {deep: true})
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
<style scoped lang="scss">
|
||||
:deep(.el-table--fit ){
|
||||
height: 300px!important;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<el-form :model="localFormData" ref="summaryForm" :rules="rules">
|
||||
<el-row gutter="50">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="名称" prop="projectName">
|
||||
<el-form-item label="项目名称" prop="projectName">
|
||||
<span>{{ localFormData.projectName }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
@@ -19,7 +19,7 @@
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="结束时间" prop="endTime">
|
||||
<span>{{ formData.endTime }}</span>
|
||||
<span>{{ localFormData.endTime }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
@@ -54,22 +54,28 @@
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="预期技术标准制定" prop="technicalStandard">
|
||||
<span>{{ filterDict(cacheStore.getDict('technical_standard'), localFormData.technicalStandard)}}</span>
|
||||
<span>{{ filterDict(cacheStore.getDict('technical_standard'), localFormData.technicalStandard) }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="产学研联合" prop="industryUniversityResearch">
|
||||
<span>{{ filterDict(cacheStore.getDict('industry_university'), localFormData.industryUniversityResearch) }}</span>
|
||||
<span>{{
|
||||
filterDict(cacheStore.getDict('industry_university'), localFormData.industryUniversityResearch)
|
||||
}}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="开展政府申报" prop="governmentDeclaration">
|
||||
<span>{{ filterDict(cacheStore.getDict('government_declaration'), localFormData.governmentDeclaration) }}</span>
|
||||
<span>{{
|
||||
filterDict(cacheStore.getDict('government_declaration'), localFormData.governmentDeclaration)
|
||||
}}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="知识产权状况" prop="intellectualProperty">
|
||||
<span>{{ filterDict(cacheStore.getDict('intellectual_property'), localFormData.intellectualProperty)}}</span>
|
||||
<span>{{
|
||||
filterDict(cacheStore.getDict('intellectual_property'), localFormData.intellectualProperty)
|
||||
}}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
@@ -98,12 +104,13 @@
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="经济概算(万元)" prop="economicEstimate">
|
||||
<el-form-item label="经济概算(元)" prop="economicEstimate">
|
||||
<span>{{ localFormData.economicEstimate }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="其中申请公司总部科技创新专项资金(万元)" prop="specialFundAmount">
|
||||
<el-form-item label="其中申请公司总部科技创新专项资金(元)" prop="specialFundAmount"
|
||||
v-if="localFormData.isSpecialFund!==null||localFormData.isSpecialFund">
|
||||
<span>{{ localFormData.specialFundAmount }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
@@ -125,28 +132,10 @@
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="需求上报附件">
|
||||
<fvTable style="width: 100%;max-height: 400px;" v-if="processViewer" :tableConfig="tableConfig"
|
||||
:data="localFormData.fileList" :isSettingCol="false" :pagination="false">
|
||||
<template #empty>
|
||||
<el-empty :image-size="90" description="暂无数据" style="padding: 0"/>
|
||||
</template>
|
||||
</fvTable>
|
||||
</el-form-item>
|
||||
<file-component title="需求上报附件" tag="需求上报"
|
||||
v-model:value="localFormData.fileList" :processViewer="processViewer"
|
||||
:file-list-show="fileListShow"/>
|
||||
</el-col>
|
||||
<!-- <el-col :span="24">-->
|
||||
<!-- <div v-if="data.taskId">-->
|
||||
<!-- <baseTitle title="审核意见"></baseTitle>-->
|
||||
<!-- <el-form-item prop="auditOpinion">-->
|
||||
<!-- <el-input-->
|
||||
<!-- v-model="localFormData.auditOpinion"-->
|
||||
<!-- :rows="3"-->
|
||||
<!-- type="textarea"-->
|
||||
<!-- placeholder="请输入审核意见"-->
|
||||
<!-- />-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- </div>-->
|
||||
<!-- </el-col>-->
|
||||
</el-row>
|
||||
<div class="approval-record">
|
||||
<baseTitle title="审批记录"></baseTitle>
|
||||
@@ -156,22 +145,19 @@
|
||||
<process-diagram-viewer v-if="processViewer" id-name="summaryProcess"/>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="oper-page-btn" v-if="data.state === '1' && data.taskId">-->
|
||||
<!-- <el-button @click="handleReject(summaryForm)">驳回</el-button>-->
|
||||
<!-- <el-button color="#DED0B2" @click="handleAgree">同意</el-button>-->
|
||||
<!-- </div>-->
|
||||
</el-form>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
import {downloadFile} from "@/api/project-demand";
|
||||
import {downloadFile, deleteFile} from "@/api/project-demand";
|
||||
import OperationRender from '@/views/workflow/common/OperationRender.vue'
|
||||
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue'
|
||||
import {useTagsView} from '@/stores/tagsview.js'
|
||||
import {getFundOption} from "@/api/special-fund";
|
||||
import {useCacheStore} from '@/stores/cache.js'
|
||||
import {getSubCompOpt} from "@/api/user/user";
|
||||
import FileComponent from "./FileComponent.vue";
|
||||
|
||||
const tagsViewStore = useTagsView()
|
||||
const cacheStore = useCacheStore()
|
||||
@@ -187,49 +173,17 @@ const props = defineProps({
|
||||
processViewer: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}, loading: {
|
||||
},
|
||||
fileListShow: {
|
||||
type: String,
|
||||
default: 'READ'
|
||||
},
|
||||
loading: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
})
|
||||
const localFormData = ref({})
|
||||
const tableConfig = reactive({
|
||||
columns: [
|
||||
{
|
||||
prop: 'index',
|
||||
type: 'index',
|
||||
label: '序号',
|
||||
align: 'center',
|
||||
width: '80',
|
||||
},
|
||||
{
|
||||
prop: 'originalFileName',
|
||||
label: '文件名',
|
||||
align: 'center',
|
||||
},
|
||||
{
|
||||
prop: 'tag',
|
||||
label: '标签',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
prop: 'size',
|
||||
label: '文件大小',
|
||||
align: 'center',
|
||||
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
|
||||
},
|
||||
{
|
||||
prop: 'oper',
|
||||
label: '操作',
|
||||
align: 'center',
|
||||
currentRender: ({row, index}) => {
|
||||
return (
|
||||
<el-button type="primary" link onClick={() => handleDownload(row)}>下载</el-button>
|
||||
)
|
||||
}
|
||||
}
|
||||
]
|
||||
})
|
||||
const router = useRouter()
|
||||
const fundOption = ref([])
|
||||
const companyOption = ref([])
|
||||
@@ -239,11 +193,11 @@ const rules = reactive({
|
||||
})
|
||||
const filterDict = (data, value) => {
|
||||
if (data === undefined || value === undefined) return;
|
||||
let label=''
|
||||
let label = ''
|
||||
if (data instanceof Array) {
|
||||
data.find(item =>{
|
||||
if( item.value == value){
|
||||
label= item.label
|
||||
data.find(item => {
|
||||
if (item.value == value) {
|
||||
label = item.label
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -277,6 +231,7 @@ const handleDownload = (row) => {
|
||||
watch(() => props.processViewer, (newVal) => {
|
||||
props.processViewer = newVal
|
||||
}, {deep: true})
|
||||
|
||||
watch(() => props.loading, (newVal) => {
|
||||
props.loading = newVal
|
||||
}, {deep: true})
|
||||
@@ -284,6 +239,7 @@ watch(() => props.loading, (newVal) => {
|
||||
watchEffect(() => {
|
||||
return Object.keys(props.formData).length && (localFormData.value = props.formData)
|
||||
})
|
||||
|
||||
getFundOptions()
|
||||
</script>
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
<template>
|
||||
<el-form :model="attachment" inline>
|
||||
<el-form-item label="关键词" prop="name">
|
||||
<el-input v-model="attachment.name" placeholder="请输入" clearable filterable style="width: 300px"/>
|
||||
<el-form-item label="名称" prop="fileName">
|
||||
<el-input v-model="attachment.fileName" placeholder="请输入附件名称查询" clearable filterable style="width: 300px"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="标签" prop="tag" v-if="type==='3'">
|
||||
<el-form-item label="标签" prop="tag" v-if="type==='40'">
|
||||
<el-select v-model="attachment.tag" placeholder="请选择标签" clearable filterable style="width: 300px">
|
||||
<el-option
|
||||
v-for="item in tagsOption"
|
||||
@@ -15,7 +15,7 @@
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button @click="handleSearch" color="#DED0B2">搜索</el-button>
|
||||
<el-button color="#DED0B2" @click="handleUpload">上传附件</el-button>
|
||||
<el-button v-if="uploadState" color="#DED0B2" @click="handleUpload">上传附件</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-card style="width: 100%">
|
||||
@@ -35,18 +35,20 @@ import {getTags} from "@/api/project-manage";
|
||||
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
const attachment = reactive({
|
||||
name: '',
|
||||
tag: ''
|
||||
})
|
||||
const attachment = reactive({})
|
||||
const emit = defineEmits(['search'])
|
||||
const props = defineProps({
|
||||
otherFileList: {
|
||||
type: Array,
|
||||
default: []
|
||||
}, type: {
|
||||
},
|
||||
type: {
|
||||
type: String,
|
||||
default: '0'
|
||||
default: '00'
|
||||
},
|
||||
uploadState:{
|
||||
type: Boolean,
|
||||
default: true
|
||||
}
|
||||
})
|
||||
const tagsOption = ref([])
|
||||
@@ -63,12 +65,13 @@ const tableConfig = reactive({
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
prop: 'processNodeTag',
|
||||
label: '内置标签',
|
||||
align: 'center'
|
||||
prop: 'size',
|
||||
label: '文件大小',
|
||||
align: 'center',
|
||||
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
|
||||
},
|
||||
{
|
||||
prop: 'size',
|
||||
prop: 'createTime',
|
||||
label: '上传时间',
|
||||
align: 'center',
|
||||
},
|
||||
@@ -90,11 +93,7 @@ const tableConfig = reactive({
|
||||
const showTable = ref(true)
|
||||
const getTagsOption = () => {
|
||||
if (!route.query.id) return
|
||||
let params = {
|
||||
projectId: route.query.id
|
||||
}
|
||||
getTags(params).then(res => {
|
||||
|
||||
getTags(route.query.id).then(res => {
|
||||
if (res.code === 1000) {
|
||||
tagsOption.value = res.data
|
||||
} else {
|
||||
@@ -122,11 +121,7 @@ const handleDownload = (row) => {
|
||||
})
|
||||
}
|
||||
watch(() => props.type, (val) => {
|
||||
console.log('va四川省l',val)
|
||||
props.type = val
|
||||
if (val === '3') {
|
||||
getTagsOption()
|
||||
}
|
||||
})
|
||||
watch(() => props.otherFileList, (val) => {
|
||||
showTable.value = false
|
||||
@@ -135,12 +130,9 @@ watch(() => props.otherFileList, (val) => {
|
||||
})
|
||||
props.otherFileList = val
|
||||
})
|
||||
if (props.type === '3') {
|
||||
if (props.type === '40') {
|
||||
getTagsOption()
|
||||
}
|
||||
defineExpose({
|
||||
tagsOption
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
@@ -42,7 +42,7 @@ const props = defineProps({
|
||||
},
|
||||
})
|
||||
const rules = reactive({
|
||||
tagName: [{required: true, message: '请输入标签名称', trigger: 'blur'}],
|
||||
tagName: [{required: true, message: '请输入标签名称', trigger: ['blur', 'change']}],
|
||||
})
|
||||
const tagForm = ref()
|
||||
const showTable = ref(true)
|
||||
@@ -93,6 +93,7 @@ const compositeParam = (item) => {
|
||||
originalFileName: item.originalFilename,
|
||||
fileType: item.fileType,
|
||||
url: item.url,
|
||||
newFile: true,
|
||||
tag: formData.value.tagName,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -74,7 +74,7 @@ const props = defineProps({
|
||||
},
|
||||
height:{
|
||||
type: Number,
|
||||
default: 650
|
||||
default: 500
|
||||
}
|
||||
})
|
||||
const content = ref(props.value);
|
||||
|
||||
@@ -5,11 +5,11 @@
|
||||
<div class="steps-box">
|
||||
<el-steps :active="localActive" finish-status="success">
|
||||
<el-step
|
||||
v-for="(item, index) in localSteps"
|
||||
:key="item.key"
|
||||
:title="item.title"
|
||||
:class="stepClass(index)"
|
||||
@click="handleStep(item.key, index)"
|
||||
v-for="(item, index) in localSteps"
|
||||
:key="item.key"
|
||||
:title="item.title"
|
||||
:class="stepClass(index)"
|
||||
@click="handleStep(item.key, index)"
|
||||
|
||||
/>
|
||||
</el-steps>
|
||||
@@ -25,10 +25,10 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
import { ElLoading, ElNotification } from 'element-plus';
|
||||
import { computed, reactive, ref, watchEffect } from 'vue';
|
||||
import { useRoute } from 'vue-router';
|
||||
import { getBaseInfoApi } from './api';
|
||||
import {ElLoading, ElNotification} from 'element-plus';
|
||||
import {computed, reactive, ref, watchEffect} from 'vue';
|
||||
import {useRoute} from 'vue-router';
|
||||
import {getBaseInfoApi} from './api';
|
||||
|
||||
const props = defineProps({
|
||||
// 步骤对应内容list
|
||||
@@ -39,12 +39,17 @@ const props = defineProps({
|
||||
// 当前显示步骤
|
||||
active: {
|
||||
type: Number,
|
||||
default:0
|
||||
default: 0
|
||||
},
|
||||
// 已完成的工作流步骤
|
||||
stepSuccess: {
|
||||
type: Array,
|
||||
default: ['00']
|
||||
},
|
||||
//直接上报/需求征集
|
||||
reportType: {
|
||||
type: String,
|
||||
default: ''
|
||||
}
|
||||
})
|
||||
|
||||
@@ -52,9 +57,7 @@ const route = useRoute()
|
||||
|
||||
const emits = defineEmits(['stepChange', 'setDetail'])
|
||||
|
||||
const localData = reactive({
|
||||
|
||||
})
|
||||
const localData = reactive({})
|
||||
|
||||
const localActive = ref(0) // 当前激活步骤
|
||||
|
||||
@@ -87,7 +90,7 @@ const localSteps = ref([
|
||||
|
||||
const baseForm = ref()
|
||||
|
||||
const schema = computed(()=>{
|
||||
const schema = computed(() => {
|
||||
return [
|
||||
{
|
||||
label: '所属公司',
|
||||
@@ -129,22 +132,43 @@ const localStepSuccess = ref([])
|
||||
// 格式化详情步骤条
|
||||
const formatProcedure = (data) => {
|
||||
let arr = []
|
||||
if(data instanceof Array) {
|
||||
data.forEach(item=>{
|
||||
switch (item) {
|
||||
case '00': arr.push(0)
|
||||
break
|
||||
case '10': arr.push(1)
|
||||
break
|
||||
case '20': arr.push(2)
|
||||
break
|
||||
// case '30': arr.push(3)
|
||||
// break
|
||||
case '40': arr.push(3)
|
||||
break
|
||||
case '50': arr.push(4)
|
||||
break
|
||||
if (data instanceof Array) {
|
||||
data.forEach(item => {
|
||||
if (props.reportType === 'direct') {
|
||||
switch (item) {
|
||||
case '10':
|
||||
arr.push(0)
|
||||
break
|
||||
case '20':
|
||||
arr.push(1)
|
||||
break
|
||||
case '40':
|
||||
arr.push(2)
|
||||
break
|
||||
case '50':
|
||||
arr.push(3)
|
||||
break
|
||||
}
|
||||
} else {
|
||||
switch (item) {
|
||||
case '00':
|
||||
arr.push(0)
|
||||
break
|
||||
case '10':
|
||||
arr.push(1)
|
||||
break
|
||||
case '20':
|
||||
arr.push(2)
|
||||
break
|
||||
case '40':
|
||||
arr.push(3)
|
||||
break
|
||||
case '50':
|
||||
arr.push(4)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
})
|
||||
}
|
||||
return arr
|
||||
@@ -153,20 +177,25 @@ const formatProcedure = (data) => {
|
||||
// 反向格式化
|
||||
const formatReProcedure = (data) => {
|
||||
let arr = []
|
||||
if(data instanceof Array) {
|
||||
data.forEach(item=>{
|
||||
if (data instanceof Array) {
|
||||
data.forEach(item => {
|
||||
switch (item) {
|
||||
case 0: arr.push('00')
|
||||
case 0:
|
||||
arr.push('00')
|
||||
break
|
||||
case 1: arr.push('10')
|
||||
case 1:
|
||||
arr.push('10')
|
||||
break
|
||||
case 2: arr.push('20')
|
||||
case 2:
|
||||
arr.push('20')
|
||||
break
|
||||
// case 3: arr.push('30')
|
||||
// break
|
||||
case 3: arr.push('40')
|
||||
// case 3: arr.push('30')
|
||||
// break
|
||||
case 3:
|
||||
arr.push('40')
|
||||
break
|
||||
case 4: arr.push('50')
|
||||
case 4:
|
||||
arr.push('50')
|
||||
break
|
||||
}
|
||||
})
|
||||
@@ -174,17 +203,24 @@ const formatReProcedure = (data) => {
|
||||
}
|
||||
|
||||
const formatActive = (val) => {
|
||||
let newVal
|
||||
if (props.reportType === 'direct') {
|
||||
newVal = val + 1
|
||||
} else {
|
||||
newVal = val
|
||||
}
|
||||
let active = ''
|
||||
val == 0 && (active = '00')
|
||||
val == 1 && (active = '10')
|
||||
val == 2 && (active = '20')
|
||||
newVal == 0 && (active = '00')
|
||||
newVal == 1 && (active = '10')
|
||||
newVal == 2 && (active = '20')
|
||||
// val == 3 && (active = '30')
|
||||
val == 3 && (active = '40')
|
||||
val == 4 && (active = '50')
|
||||
newVal == 3 && (active = '40')
|
||||
newVal == 4 && (active = '50')
|
||||
return active
|
||||
}
|
||||
|
||||
const stepClass = (val) => {
|
||||
console.log('localStepSuccess.value',localStepSuccess.value,val)
|
||||
if (localStepSuccess.value.includes(val)) {
|
||||
return 'step-success'
|
||||
}
|
||||
@@ -192,24 +228,45 @@ const stepClass = (val) => {
|
||||
}
|
||||
|
||||
const handleStep = (key, index) => {
|
||||
console.log('key, index',key, index)
|
||||
if (localStepSuccess.value.includes(index)) {
|
||||
let active = ''
|
||||
localActive.value = index
|
||||
switch(index) {
|
||||
case 0: active = '00'
|
||||
break
|
||||
case 1: active = '10'
|
||||
break
|
||||
case 2: active = '20'
|
||||
break
|
||||
// case 3: active = '30'
|
||||
// break
|
||||
case 3: active = '40'
|
||||
break
|
||||
case 4: active = '50'
|
||||
break
|
||||
if (props.reportType === 'direct') {
|
||||
switch (index) {
|
||||
case 0:
|
||||
active = '10'
|
||||
break
|
||||
case 1:
|
||||
active = '20'
|
||||
break
|
||||
case 2:
|
||||
active = '40'
|
||||
break
|
||||
case 3:
|
||||
active = '50'
|
||||
break
|
||||
}
|
||||
} else {
|
||||
switch (index) {
|
||||
case 0:
|
||||
active = '00'
|
||||
break
|
||||
case 1:
|
||||
active = '10'
|
||||
break
|
||||
case 2:
|
||||
active = '20'
|
||||
break
|
||||
case 3:
|
||||
active = '40'
|
||||
break
|
||||
case 4:
|
||||
active = '50'
|
||||
break
|
||||
}
|
||||
}
|
||||
emits('stepChange', { key, active })
|
||||
emits('stepChange', {key, active})
|
||||
return
|
||||
}
|
||||
ElNotification({
|
||||
@@ -222,10 +279,9 @@ const handleStep = (key, index) => {
|
||||
const getBaseInfo = async () => {
|
||||
const loading = ElLoading.service({fullscreen: true})
|
||||
try {
|
||||
const { code, data } = await getBaseInfoApi(route.query.projectId)
|
||||
const {code, data} = await getBaseInfoApi(route.query.projectId)
|
||||
localStepSuccess.value = formatProcedure(data.procedure)
|
||||
baseForm.value.setValues(data)
|
||||
console.log(formatActive(localActive.value), 'formatActive(localActive.value)');
|
||||
emits('setDetail', formatActive(localActive.value))
|
||||
loading.close()
|
||||
} catch {
|
||||
@@ -238,6 +294,11 @@ getBaseInfo()
|
||||
watchEffect(() => {
|
||||
localActive.value = props.active
|
||||
})
|
||||
watchEffect(() => {
|
||||
if (props.reportType === 'direct') {
|
||||
localSteps.value = localSteps.value.slice(1)
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
||||
@@ -158,4 +158,4 @@ export const usePermisstionStroe = defineStore('permisstion', () => {
|
||||
removeMenu,
|
||||
setIsSuccessReq
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
@@ -232,11 +232,6 @@ const getDetailInfo = async () => {
|
||||
const init = async () => {
|
||||
processDiagramViewer.value = false
|
||||
getAllocationProcess().then(res => {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
if (res.code === 1000) {
|
||||
let data = res.data
|
||||
processInstanceData.value = data
|
||||
@@ -249,6 +244,12 @@ const init = async () => {
|
||||
nextTick(() => {
|
||||
processDiagramViewer.value = true
|
||||
})
|
||||
}else {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: 'error'
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@@ -15,12 +15,15 @@
|
||||
</el-form>
|
||||
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
|
||||
<el-tab-pane label="分摊明细" name="first">
|
||||
<expense-detail :formData="shareData.formData" :data="shareData" :showTable="showTable"
|
||||
:processViewer="shareProcessViewer"
|
||||
<expense-detail :processViewer="shareProcessViewer" :detailList="detailList"
|
||||
:loading="loading"/>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="分摊汇总" name="second">
|
||||
|
||||
<!-- <fvTable ref="tableIns" :tableConfig="tableConfig" @headBtnClick="headBtnClick">-->
|
||||
<!-- <template #empty>-->
|
||||
<!-- <el-empty description="暂无数据"/>-->
|
||||
<!-- </template>-->
|
||||
<!-- </fvTable>-->
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
<div class="approval-record">
|
||||
@@ -35,34 +38,44 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
import OperationRender from '@/views/workflow/common/OperationRender.vue'
|
||||
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue'
|
||||
import {ElNotification} from "element-plus";
|
||||
import {useProcessStore} from '@/stores/processStore.js';
|
||||
import {getAllocationDetail} from "@/api/expense-manage";
|
||||
import {getAllocationDetail, getAllocationDetailList} from "@/api/expense-manage";
|
||||
|
||||
const processStore = useProcessStore()
|
||||
const route = useRoute()
|
||||
const shareData = ref({})
|
||||
const detailList = ref([])
|
||||
const formData = ref({})
|
||||
const shareProcessViewer = ref(true)
|
||||
const showTable = ref(true)
|
||||
const loading = ref(false)
|
||||
const activeName = ref('first')
|
||||
const getDetail = async () => {
|
||||
const id = route.query.id
|
||||
showTable.value = false
|
||||
shareProcessViewer.value = false
|
||||
loading.value = true
|
||||
const {code, data, msg} = await getAllocationDetail(id)
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: msg,
|
||||
type: code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
if (code === 1000) {
|
||||
shareData.value = data
|
||||
formData.value = data.formData
|
||||
loading.value = false
|
||||
if(data.operationList==null)return;
|
||||
} else {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: msg,
|
||||
type: 'error'
|
||||
})
|
||||
}
|
||||
loading.value = false
|
||||
}
|
||||
const getDetailList = async () => {
|
||||
let params = {
|
||||
allocationId: route.query.id
|
||||
}
|
||||
shareProcessViewer.value = false
|
||||
const {code, data, msg} = await getAllocationDetailList(params)
|
||||
if (code === 1000) {
|
||||
detailList.value = data
|
||||
processStore.setDesign(data)
|
||||
processStore.runningList.value = data.runningList;
|
||||
processStore.endList.value = data.endList;
|
||||
@@ -71,32 +84,36 @@ const getDetail = async () => {
|
||||
processStore.passList.value = data.passList;
|
||||
nextTick(() => {
|
||||
shareProcessViewer.value = true
|
||||
showTable.value = true
|
||||
})
|
||||
} else {
|
||||
loading.value = false
|
||||
}else {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: msg,
|
||||
type: 'error'
|
||||
})
|
||||
}
|
||||
}
|
||||
getDetail()
|
||||
getDetailList()
|
||||
</script>
|
||||
<style scoped lang="scss">
|
||||
:deep(.el-tabs__nav-scroll) {
|
||||
width: 100%;
|
||||
:deep(.el-tabs__nav-scroll) {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
|
||||
.el-tabs__nav {
|
||||
display: flex;
|
||||
flex: 1;
|
||||
|
||||
.el-tabs__nav {
|
||||
display: flex;
|
||||
.el-tabs__item {
|
||||
flex: 1;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.el-tabs__item {
|
||||
flex: 1;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.is-active {
|
||||
color: black;
|
||||
//background-color: #DED0B2;
|
||||
}
|
||||
.is-active {
|
||||
color: black;
|
||||
//background-color: #DED0B2;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -77,7 +77,13 @@ const tableConfig = reactive({
|
||||
label: '状态',
|
||||
align: 'center',
|
||||
showOverflowTooltip: false,
|
||||
// currentRender: ({row, index}) => (<Tag dictType={'special_fund'} value={row.state}/>)
|
||||
currentRender: ({row, index}) => {
|
||||
if (row.state == undefined||row.state == 0) {
|
||||
return '--'
|
||||
} else {
|
||||
return (<Tag dictType={'special_fund'} value={row.state}/>)
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
prop: 'oper',
|
||||
|
||||
@@ -46,14 +46,14 @@
|
||||
</el-col>
|
||||
</el-row>
|
||||
</div>
|
||||
<div v-else style="display: flex; justify-content: center; align-items: center; height: 100%;" >
|
||||
<div v-else style="display: flex; justify-content: center; align-items: center; height: 100%;">
|
||||
您没有任何角色, 请联系管理员!
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
import 'element-plus/theme-chalk/display.css'
|
||||
import { useAuthStore } from '@/stores/userstore.js'
|
||||
import {useAuthStore} from '@/stores/userstore.js'
|
||||
|
||||
const AuthStore = useAuthStore()
|
||||
const router = useRouter()
|
||||
@@ -120,9 +120,9 @@ const tableConfig = reactive({
|
||||
align: 'center',
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => {
|
||||
if(row.targetState!==null||row.targetState!==undefined){
|
||||
if (row.targetState !== null || row.targetState !== undefined) {
|
||||
return (<Tag dictType={'todo_type'} value={row.targetState}/>)
|
||||
}else {
|
||||
} else {
|
||||
return '--'
|
||||
}
|
||||
}
|
||||
@@ -148,7 +148,6 @@ const tableConfig = reactive({
|
||||
return (
|
||||
<div>
|
||||
<el-button type="primary" link onClick={() => handleView(row)}>查看</el-button>
|
||||
<el-button type="primary" link onClick={() => handleEdit(row)}>已读</el-button>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -162,16 +161,36 @@ const handleView = (row) => {
|
||||
router.push({
|
||||
name: 'Requirement/detail',
|
||||
query: {
|
||||
id: row.targetId
|
||||
id: row.targetId,
|
||||
source: 'home'
|
||||
}
|
||||
})
|
||||
} else{
|
||||
} else if (row.targetState == '10' && row.targetId) {
|
||||
router.push({
|
||||
name: 'Summary/detail',
|
||||
query: {
|
||||
projectId: row.targetId,
|
||||
state: row.state,
|
||||
source: 'home'
|
||||
}
|
||||
})
|
||||
} else if (row.targetState == '20'||row.targetState == '40'||row.targetState == '50'){
|
||||
router.push({
|
||||
name: 'Implementation/detail',
|
||||
query: {
|
||||
projectId: row.targetId,
|
||||
state: row.state,
|
||||
step: row.targetState
|
||||
step: row.targetState,
|
||||
source: 'home'
|
||||
}
|
||||
})
|
||||
}else if (row.targetState == '70' && row.targetId) {
|
||||
router.push({
|
||||
name: 'Fund/detail',
|
||||
query: {
|
||||
id: row.targetId,
|
||||
state: row.state,
|
||||
source: 'home'
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item v-if="checkFormPrem('deadline')" label="截止时间" prop="deadline">
|
||||
<el-form-item label="截止时间" prop="deadline">
|
||||
<el-config-provider>
|
||||
<el-date-picker
|
||||
v-model="formData.deadline"
|
||||
@@ -57,9 +57,9 @@
|
||||
v-model:value="formData.collectExplain" />
|
||||
<baseTitle title="申请文件"></baseTitle>
|
||||
<file-upload v-if="checkFormPrem('fileList')" @getFile="getFile"/>
|
||||
<fvTable style="width: 100%;max-height: 600px;height: 600px" v-if="showTable"
|
||||
<fvTable style="width: 100%;max-height: 300px;" v-if="showTable"
|
||||
:tableConfig="tableConfig" :data="formData.fileList"
|
||||
:isSettingCol="false" :pagination="false">
|
||||
:isSettingCol="false" :pagination="false" perm="EDIT">
|
||||
<template #empty>
|
||||
<el-empty :image-size="90" description="暂无数据" style="padding: 0"/>
|
||||
</template>
|
||||
@@ -74,7 +74,6 @@
|
||||
<div class="oper-page-btn">
|
||||
<el-button color="#DED0B2" v-if="routerName==='Requirement/add'" @click="handleSubmit(demandForm)">提交</el-button>
|
||||
<el-button color="#DED0B2" v-else @click="handleResubmit">重新提交</el-button>
|
||||
<el-button @click="handleBack">返回</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@@ -217,11 +216,11 @@ const compositeParam = (item) => {
|
||||
url: item.url,
|
||||
processNodeTag: null,
|
||||
tag: tag,
|
||||
newFile: true,
|
||||
userId: authStore.userinfo.userId
|
||||
}
|
||||
}
|
||||
const getFile = (val) => {
|
||||
console.log('上传文件', val)
|
||||
showTable.value = false
|
||||
let fileObj = compositeParam(val)
|
||||
formData.value.fileList.push(fileObj)
|
||||
@@ -367,7 +366,7 @@ onMounted(async () => {
|
||||
margin-top: 0;
|
||||
}
|
||||
:deep(.el-table--fit ){
|
||||
height: 600px;
|
||||
height: 300px!important;
|
||||
}
|
||||
.add-block {
|
||||
//display: flex;
|
||||
|
||||
@@ -3,22 +3,22 @@
|
||||
<el-form :model="formData" ref="demandForm" label-width="auto" :rules="rules">
|
||||
<baseTitle title="需求征集详情"></baseTitle>
|
||||
<el-row>
|
||||
<el-col :span="12" v-if="checkFormPrem('requirementName')">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="名称">
|
||||
<span>{{ formData.requirementName }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12" v-if="checkFormPrem('companyIds')">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="所属公司">
|
||||
<span>{{ formData.companyIds }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12" v-if="checkFormPrem('collectType')">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="征集类型">
|
||||
<span>{{ formData.collectType }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12" v-if="checkFormPrem('deadline')">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="截止时间">
|
||||
<span>{{ formData.deadline }}</span>
|
||||
</el-form-item>
|
||||
@@ -29,7 +29,7 @@
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<baseTitle title="征集说明"></baseTitle>
|
||||
<el-col :span="24" v-if="checkFormPrem('collectExplain')">
|
||||
<el-col :span="24">
|
||||
<el-form-item>
|
||||
<el-card style="width: 100%">
|
||||
<div v-html="formData.collectExplain">
|
||||
@@ -37,11 +37,13 @@
|
||||
</el-card>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<baseTitle title="附件列表"></baseTitle>
|
||||
<el-col :span="24" v-if="checkFormPrem('collectExplain')">
|
||||
<baseTitle v-if="fileListShow === 'READ' || fileListShow === 'EDIT'" title="附件列表"></baseTitle>
|
||||
<el-col :span="24" v-if="fileListShow === 'READ' || fileListShow === 'EDIT'">
|
||||
<el-form-item>
|
||||
<file-upload v-if="fileListShow === 'EDIT'" @getFile="getFile"/>
|
||||
<fvTable style="width: 100%;max-height: 600px;height: 600px" v-if="showTable" :tableConfig="tableConfig"
|
||||
:data="formData.fileList" :isSettingCol="false" :pagination="false">
|
||||
:data="formData.fileList" :isSettingCol="false"
|
||||
:pagination="false">
|
||||
<template #empty>
|
||||
<el-empty :image-size="90" description="暂无数据" style="padding: 0"/>
|
||||
</template>
|
||||
@@ -74,7 +76,7 @@
|
||||
</el-row>
|
||||
</el-form>
|
||||
<div class="oper-page-btn" v-if="processInstanceData.state === '1' && processInstanceData.taskId">
|
||||
<el-button @click="handleReject(demandForm)">驳回</el-button>
|
||||
<el-button type="danger" @click="handleReject(demandForm)">驳回</el-button>
|
||||
<el-button color="#DED0B2" @click="handleSubmit">同意</el-button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -84,13 +86,15 @@
|
||||
import OperationRender from '@/views/workflow/common/OperationRender.vue'
|
||||
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue'
|
||||
import {useProcessStore} from '@/stores/processStore.js';
|
||||
import {getInfo, agreeTask, rejectTask, downloadFile} from "@/api/project-demand/index.js";
|
||||
import {getInfo, agreeTask, rejectTask,
|
||||
deleteFile,downloadFile} from "@/api/project-demand/index.js";
|
||||
import {getSubCompOpt} from '@/api/user/user.js'
|
||||
import {ElNotification} from "element-plus";
|
||||
import {ElMessage, ElMessageBox, ElNotification} from "element-plus";
|
||||
import {useTagsView} from '@/stores/tagsview.js'
|
||||
import {matterTree} from '@/utils/matterTree.js';
|
||||
import {getFundOption} from "@/api/special-fund";
|
||||
|
||||
|
||||
const tagsViewStore = useTagsView()
|
||||
const router = useRouter()
|
||||
const route = useRoute()
|
||||
@@ -100,8 +104,8 @@ const demandForm = ref()
|
||||
const processStore = useProcessStore()
|
||||
const companyOption = ref([])
|
||||
const specialFundOption = ref([])
|
||||
const formPermMap = ref(new Map());
|
||||
const processInstanceData = ref({})
|
||||
const fileListShow = ref("READ")
|
||||
const showTable = ref(false)
|
||||
const processDiagramViewer = ref(false)
|
||||
const processTree = ref()
|
||||
@@ -139,29 +143,34 @@ const tableConfig = reactive({
|
||||
prop: 'oper',
|
||||
label: '操作',
|
||||
align: 'center',
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => {
|
||||
let btn = []
|
||||
btn.push({label: '下载', func: () => handleDownload(row), type: 'primary'})
|
||||
if (row.newFile){
|
||||
btn.push({label: '删除', func: () => handleDelete(row), type: 'primary'})
|
||||
}
|
||||
|
||||
return (
|
||||
<el-button type="primary" link onClick={() => handleDownload(row)}>下载</el-button>
|
||||
<div style={{width: '100%'}}>
|
||||
{
|
||||
btn.map(item => (
|
||||
<el-button
|
||||
type={item.type}
|
||||
onClick={() => item.func()}
|
||||
link
|
||||
>
|
||||
{item.label}
|
||||
</el-button>
|
||||
))
|
||||
}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
||||
]
|
||||
})
|
||||
|
||||
const checkFormPrem = (formKey) => {
|
||||
if (formPermMap.value.hasOwnProperty(formKey)) {
|
||||
let formItem = formPermMap.value[formKey];
|
||||
return formItem.perm === 'READ'
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const fromPrem = (formKey) => {
|
||||
let formItem = formPermMap.value[formKey];
|
||||
return formItem.perm
|
||||
}
|
||||
|
||||
const handleSubmit = () => {
|
||||
let approve = {
|
||||
@@ -238,13 +247,20 @@ const init = async () => {
|
||||
await getCompanyOption()
|
||||
await getFundOptions()
|
||||
getInfo(route.query.id).then(res => {
|
||||
if (res.code !== 1000) {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: 'error'
|
||||
})
|
||||
}
|
||||
loading.value = false
|
||||
let data = res.data
|
||||
formData.value = data.formData;
|
||||
data.formData.companyIds = getCompanyOptionItem(data.formData.companyIds)
|
||||
if(data.formData.specialFund){
|
||||
if (data.formData.specialFund) {
|
||||
specialFundOption.value.forEach(item => {
|
||||
if(data.formData.specialFund==item.value){
|
||||
if (data.formData.specialFund == item.value) {
|
||||
data.formData.specialFund = item.label
|
||||
}
|
||||
})
|
||||
@@ -259,6 +275,9 @@ const init = async () => {
|
||||
nextTick(() => {
|
||||
processDiagramViewer.value = true
|
||||
showTable.value = true
|
||||
if (data.formPermMap["fileList"]) {
|
||||
fileListShow.value = data.formPermMap["fileList"].perm
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
@@ -266,14 +285,64 @@ onMounted(async () => {
|
||||
loading.value = true
|
||||
await init()
|
||||
})
|
||||
|
||||
|
||||
const getFile = (val) => {
|
||||
showTable.value = false
|
||||
let fileObj = compositeParam(val)
|
||||
formData.value.fileList.push(fileObj)
|
||||
nextTick(() => {
|
||||
showTable.value = true
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
const compositeParam = (item) => {
|
||||
let tag = ''
|
||||
if (!formData.value.collectType && routerName.value === 'Requirement/add') {
|
||||
tag = '需求征集'
|
||||
}else if(!formData.value.collectType &&routerName.value === 'Requirement/edit'){
|
||||
tag = '需求征集'
|
||||
}if (formData.value.collectType) {
|
||||
tag = formData.value.collectType
|
||||
}
|
||||
return {
|
||||
fileId: item.id,
|
||||
size: item.size,
|
||||
originalFileName: item.originalFilename,
|
||||
fileType: item.fileType,
|
||||
url: item.url,
|
||||
processNodeTag: null,
|
||||
newFile: true,
|
||||
tag: tag,
|
||||
}
|
||||
}
|
||||
|
||||
const handleDelete = (row) => {
|
||||
ElMessageBox.confirm(`确认删除名称为${row.originalFileName}的表格吗?`, '系统提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}).then(() => {
|
||||
deleteFile(row.fileId).then(res => {
|
||||
if (res.code === 1000) {
|
||||
ElMessage.success("删除成功");
|
||||
formData.value.fileList.splice(formData.value.fileList.findIndex((item) => item.id === row.fileId), 1);
|
||||
}
|
||||
});
|
||||
}).catch(() => {
|
||||
ElMessage.warning("用户取消删除! ");
|
||||
})
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
:deep(.el-empty__description) {
|
||||
margin-top: 0;
|
||||
}
|
||||
:deep(.el-table--fit ){
|
||||
height: 600px;
|
||||
|
||||
:deep(.el-table--fit ) {
|
||||
height: 300px !important;
|
||||
}
|
||||
.detail-block {
|
||||
overflow: hidden;
|
||||
|
||||
@@ -82,6 +82,7 @@ const compositeParam = (item) => {
|
||||
originalFileName: item.originalFilename,
|
||||
fileType: item.fileType,
|
||||
url: item.url,
|
||||
newFile: true,
|
||||
tag:'需求征集'
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,24 +8,25 @@
|
||||
<el-input v-model="formData.projectName" placeholder="请输入项目名称" clearable></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<!-- <el-col :span="5">-->
|
||||
<!-- <el-form-item label="是否专项资金" prop="isSpecialFund">-->
|
||||
<!-- <el-radio-group v-model="formData.isSpecialFund" >-->
|
||||
<!-- <el-radio :label="true">是</el-radio>-->
|
||||
<!-- <el-radio :label="false">否</el-radio>-->
|
||||
<!-- </el-radio-group>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- </el-col>-->
|
||||
<el-col :span="5">
|
||||
<el-form-item label="是否专项资金" prop="isSpecialFund">
|
||||
<el-radio-group v-model="formData.isSpecialFund">
|
||||
<el-radio :label="true">是</el-radio>
|
||||
<el-radio :label="false">否</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="专项资金" prop="specialFund" v-if="formData.isSpecialFund">
|
||||
<el-select v-model="formData.specialFund" placeholder="请选择专项资金" clearable filterable>
|
||||
<el-option
|
||||
v-for="item in specialFundOption"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
<!-- <span>{{ getSpecialFundName(formData.specialFund) }}</span>-->
|
||||
<el-select v-model="formData.specialFund" placeholder="请选择专项资金" clearable filterable>
|
||||
<el-option
|
||||
v-for="item in specialFundOption"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
@@ -33,8 +34,9 @@
|
||||
<el-config-provider>
|
||||
<el-date-picker
|
||||
v-model="formData.startTime"
|
||||
type="datetime"
|
||||
type="date"
|
||||
placeholder="开始时间"
|
||||
format="YYYY-MM-DD"
|
||||
value-format="YYYY-MM-DD HH:mm:ss"
|
||||
style="width: 100%"
|
||||
/>
|
||||
@@ -46,10 +48,13 @@
|
||||
<el-config-provider>
|
||||
<el-date-picker
|
||||
v-model="formData.endTime"
|
||||
type="datetime"
|
||||
type="date"
|
||||
placeholder="结束时间"
|
||||
format="YYYY-MM-DD"
|
||||
value-format="YYYY-MM-DD HH:mm:ss"
|
||||
style="width: 100%"
|
||||
:disabled="!formData.startTime"
|
||||
:disabled-date="disabledDate"
|
||||
/>
|
||||
</el-config-provider>
|
||||
</el-form-item>
|
||||
@@ -199,12 +204,12 @@
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="经济概算(万元)" prop="economicEstimate">
|
||||
<el-form-item label="经济概算(元)" prop="economicEstimate">
|
||||
<el-input v-model="formData.economicEstimate" clearable></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="其中申请公司总部科技创新专项资金(万元)" prop="specialFundAmount">
|
||||
<el-form-item label="其中申请公司总部科技创新专项资金(元)" prop="specialFundAmount" v-if="formData.isSpecialFund">
|
||||
<el-input v-model="formData.specialFundAmount" clearable></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
@@ -243,7 +248,7 @@
|
||||
<script setup lang="jsx">
|
||||
import {debounce} from 'lodash'
|
||||
import {getDetail, getProcessInfo, requirementReported, resubmitReported} from "./api";
|
||||
import {ElMessage, ElNotification} from "element-plus";
|
||||
import {ElNotification} from "element-plus";
|
||||
import {useTagsView} from '@/stores/tagsview.js'
|
||||
import {useCacheStore} from '@/stores/cache.js'
|
||||
import {useProcessStore} from '@/stores/processStore.js';
|
||||
@@ -272,21 +277,22 @@ const formData = ref({
|
||||
industryUniversityResearch: '0',
|
||||
governmentDeclaration: '0',
|
||||
})
|
||||
|
||||
const rules = reactive({
|
||||
projectName: [{required: true, message: '请输入项目名称', trigger: 'blur'}],
|
||||
specialFund: [{required: true, message: '请选择专项资金', trigger: 'blur'}],
|
||||
startTime: [{required: true, message: '请选择开始时间', trigger: 'blur'}],
|
||||
rdSubject: [{required: true, message: '请输入研发主体', trigger: 'blur'}],
|
||||
projectType: [{required: true, message: '请选择项目类型', trigger: 'blur'}],
|
||||
endTime: [{required: true, message: '请选择结束时间', trigger: 'blur'}],
|
||||
investmentType: [{required: true, message: '请选择出资类型', trigger: 'blur'}],
|
||||
projectImpact: [{required: true, message: '请选择项目影响', trigger: 'blur'}],
|
||||
businessSegment: [{required: true, message: '请选择所属业务板块', trigger: 'blur'}],
|
||||
resultForm: [{required: true, message: '请选择预期成果形式', trigger: 'blur'}],
|
||||
technicalStandard: [{required: true, message: '请选择预期技术标准制定', trigger: 'blur'}],
|
||||
industryUniversityResearch: [{required: true, message: '请选择产学研联合', trigger: 'blur'}],
|
||||
governmentDeclaration: [{required: true, message: '请选择开展政府申报', trigger: 'blur'}],
|
||||
intellectualProperty: [{required: true, message: '请选择知识产权状况', trigger: 'blur'}],
|
||||
startTime: [{required: true, message: '请选择开始时间', trigger: ['blur', 'change']}],
|
||||
endTime: [{required: true, message: '请选择结束时间', trigger: ['blur', 'change']}],
|
||||
rdSubject: [{required: true, message: '请选择研发主体', trigger: ['blur', 'change']}],
|
||||
projectType: [{required: true, message: '请选择项目类型', trigger: ['blur', 'change']}],
|
||||
investmentType: [{required: true, message: '请选择出资类型', trigger: ['blur', 'change']}],
|
||||
projectImpact: [{required: true, message: '请选择项目影响', trigger: ['blur', 'change']}],
|
||||
businessSegment: [{required: true, message: '请选择所属业务板块', trigger: ['blur', 'change']}],
|
||||
resultForm: [{required: true, message: '请选择预期成果形式', trigger: ['blur', 'change']}],
|
||||
technicalStandard: [{required: true, message: '请选择预期技术标准制定', trigger: ['blur', 'change']}],
|
||||
industryUniversityResearch: [{required: true, message: '请选择产学研联合', trigger: ['blur', 'change']}],
|
||||
governmentDeclaration: [{required: true, message: '请选择开展政府申报', trigger: ['blur', 'change']}],
|
||||
intellectualProperty: [{required: true, message: '请选择知识产权状况', trigger: ['blur', 'change']}],
|
||||
inventionPatent: [{required: true, message: '请输入发明专利', trigger: 'blur'}],
|
||||
newPatent: [{required: true, message: '请输入实用性新型专利', trigger: 'blur'}],
|
||||
softwareCopyright: [{required: true, message: '请输入软件著作权', trigger: 'blur'}],
|
||||
@@ -297,16 +303,33 @@ const rules = reactive({
|
||||
serviceDescription: [{required: true, message: '请输入现有业务描述', trigger: 'blur'}],
|
||||
contentDescription: [{required: true, message: '请输入研发项目关键内容描述', trigger: 'blur'}]
|
||||
})
|
||||
// const getIsFund = async () => {
|
||||
// getFormInfo(route.query.id).then(res => {
|
||||
// if (res.code === 1000) {
|
||||
// formData.value.isSpecialFund = res.data.isSpecialFund
|
||||
// if(res.data.isSpecialFund){
|
||||
// formData.value.specialFund = Number(res.data.specialFund)
|
||||
// }
|
||||
// }
|
||||
// })
|
||||
// }
|
||||
|
||||
const disabledDate = (time) => {
|
||||
return time.getTime() < new Date(formData.value.startTime).getTime();
|
||||
}
|
||||
|
||||
const getIsFund = async () => {
|
||||
if (!route.query.id) return;
|
||||
loading.value = true
|
||||
await getFormInfo(route.query.id).then(res => {
|
||||
if (res.code === 1000) {
|
||||
loading.value = false
|
||||
formData.value.isSpecialFund = res.data.isSpecialFund
|
||||
if (res.data.isSpecialFund) {
|
||||
formData.value.specialFund = Number(res.data.specialFund)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
const getSpecialFundName = (val) => {
|
||||
let label
|
||||
specialFundOption.value.forEach(item => {
|
||||
if (item.value == val) {
|
||||
label = item.label
|
||||
}
|
||||
})
|
||||
return label
|
||||
}
|
||||
const compositeParam = (item, type) => {
|
||||
let tag = ''
|
||||
if (name.value === 'Summary/add' || name.value === 'Summary/edit') {
|
||||
@@ -318,6 +341,7 @@ const compositeParam = (item, type) => {
|
||||
originalFileName: item.originalFilename,
|
||||
fileType: item.fileType,
|
||||
url: item.url,
|
||||
newFile: true,
|
||||
tag: tag
|
||||
}
|
||||
}
|
||||
@@ -345,13 +369,13 @@ const getFileParam = (item) => {
|
||||
const handleSubmit = debounce(async (instance) => {
|
||||
if (!instance) return
|
||||
instance.validate(async (valid, fields) => {
|
||||
if (!valid) return
|
||||
// if (JSON.stringify(file.value) === "{}") {
|
||||
// attachment.value.validate()
|
||||
// } else {
|
||||
// attachment.value.clearValidate()
|
||||
// }
|
||||
|
||||
if (!valid) {
|
||||
return ElNotification({
|
||||
title: '提示',
|
||||
message: '请完善数据,再提交!',
|
||||
type: 'error'
|
||||
})
|
||||
}
|
||||
let singleFile = {}
|
||||
if (file.value.fileId !== undefined) {
|
||||
singleFile = {
|
||||
@@ -393,12 +417,13 @@ const handleSubmit = debounce(async (instance) => {
|
||||
// }
|
||||
let params = {
|
||||
...formData.value,
|
||||
isSpecialFund:false,
|
||||
isSpecialFund: formData.value.isSpecialFund ? formData.value.isSpecialFund : false,
|
||||
deploymentId: deploymentId.value,
|
||||
fileList: otherFiles,
|
||||
singleFile: singleFile,
|
||||
requirementId: route.query.id
|
||||
requirementId: route.query.id ? route.query.id : '-1'
|
||||
}
|
||||
console.log('params', params)
|
||||
if (JSON.stringify(singleFile) === "{}") {
|
||||
attachment.value.validate()
|
||||
ElNotification({
|
||||
@@ -407,10 +432,9 @@ const handleSubmit = debounce(async (instance) => {
|
||||
type: 'error'
|
||||
})
|
||||
return;
|
||||
}else {
|
||||
} else {
|
||||
attachment.value.clearValidate()
|
||||
}
|
||||
console.log('params', params)
|
||||
let res = await requirementReported(params)
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
@@ -430,12 +454,6 @@ const handleResubmit = debounce(() => {
|
||||
let otherFiles = []
|
||||
let fileArray
|
||||
if (name.value === 'Summary/edit') {
|
||||
// console.log('attachment.value', attachment.value.singleFile)
|
||||
// if (attachment.value.singleFile === null) {
|
||||
// attachment.value.validate()
|
||||
// } else {
|
||||
// attachment.value.clearValidate()
|
||||
// }
|
||||
singleFile = {
|
||||
fileId: attachment.value.singleFile?.fileId
|
||||
}
|
||||
@@ -457,7 +475,7 @@ const handleResubmit = debounce(() => {
|
||||
deploymentId: deploymentId.value,
|
||||
fileList: otherFiles,
|
||||
singleFile: singleFile,
|
||||
requirementId: route.query.id
|
||||
requirementId: route.query.id ? route.query.id : '-1'
|
||||
}
|
||||
if (JSON.stringify(singleFile) === "{}") {
|
||||
attachment.value.validate()
|
||||
@@ -467,7 +485,7 @@ const handleResubmit = debounce(() => {
|
||||
type: 'error'
|
||||
})
|
||||
return;
|
||||
}else {
|
||||
} else {
|
||||
attachment.value.clearValidate()
|
||||
}
|
||||
console.log('重新提交params', params)
|
||||
@@ -502,7 +520,7 @@ const getDetailInfo = async () => {
|
||||
const init = async () => {
|
||||
const resFund = await getFundOption()
|
||||
specialFundOption.value = resFund.data
|
||||
// await getIsFund()
|
||||
await getIsFund()
|
||||
const res = await getSubCompOpt()
|
||||
companyOption.value = res.data
|
||||
getProcessInfo().then(res => {
|
||||
@@ -542,9 +560,4 @@ const staging = async () => {
|
||||
overflow: hidden;
|
||||
padding-bottom: 30px;
|
||||
}
|
||||
|
||||
:deep(.el-table--fit) {
|
||||
height: auto !important;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
<template>
|
||||
<steps :active="1" @setDetail="setDetail" @stepChange="stepChange">
|
||||
<steps :active="route.query.id==='-1'?0:1" @setDetail="setDetail" @stepChange="stepChange" :reportType="route.query.id==='-1'?'direct':''">
|
||||
<template #content>
|
||||
<collection-detail v-show="showActive == '00'" :formData="summaryData.formData" :data="summaryData"
|
||||
:processViewer="summaryProcessViewer" :loading="loading"/>
|
||||
<summary-detail v-show="showActive == '10'" :formData="summaryData.formData" :data="summaryData"
|
||||
:processViewer="summaryProcessViewer" :loading="loading"/>
|
||||
<ApprovalDetail v-show="showActive == '20'" :formData="summaryData.formData" :data="summaryData" :processViewer="summaryProcessViewer" :loading="loading"></ApprovalDetail>
|
||||
:processViewer="summaryProcessViewer" :loading="loading" :fileListShow="fileListShow"/>
|
||||
<ApprovalDetail v-show="showActive == '20'" :formData="summaryData.formData" :data="summaryData"
|
||||
:processViewer="summaryProcessViewer" :loading="loading" :fileListShow="fileListShow"/>
|
||||
<ApprovalDetail type="execute" v-show="showActive == '40'" :formData="summaryData.formData" :data="summaryData"
|
||||
:processViewer="summaryProcessViewer" :loading="loading"></ApprovalDetail>
|
||||
:processViewer="summaryProcessViewer" :loading="loading" :fileListShow="fileListShow"/>
|
||||
<ApprovalDetail type="archivist" v-show="showActive == '50'" :formData="summaryData.formData" :data="summaryData"
|
||||
:processViewer="summaryProcessViewer" :loading="loading"></ApprovalDetail>
|
||||
|
||||
:processViewer="summaryProcessViewer" :loading="loading" :fileListShow="fileListShow"/>
|
||||
</template>
|
||||
</steps>
|
||||
<opinion v-if="summaryData.taskId" :formData="summaryData.formData" :taskId="summaryData.taskId"></opinion>
|
||||
@@ -27,6 +27,7 @@ const route = useRoute()
|
||||
const summaryData = ref({})
|
||||
const summaryProcessViewer = ref(true)
|
||||
const loading = ref(false)
|
||||
const fileListShow = ref('READ')
|
||||
const processStore = useProcessStore()
|
||||
const active = ref(route.query.state)
|
||||
const showActive = ref()
|
||||
@@ -47,6 +48,10 @@ const getInfo = async (state) => {
|
||||
processStore.passList.value = data.passList;
|
||||
nextTick(() => {
|
||||
summaryProcessViewer.value = true
|
||||
console.log('data.formPermMap["fileList"]',data.formPermMap["fileList"])
|
||||
if (data.formPermMap["fileList"]) {
|
||||
fileListShow.value = data.formPermMap["fileList"].perm
|
||||
}
|
||||
})
|
||||
}else {
|
||||
ElNotification({
|
||||
|
||||
@@ -7,12 +7,11 @@
|
||||
import {reactive, ref, shallowRef} from 'vue';
|
||||
import fvSelect from '@/fvcomponents/fvSelect/index.vue'
|
||||
import {useRouter} from 'vue-router';
|
||||
|
||||
const localData = reactive({})
|
||||
|
||||
const tableIns = ref()
|
||||
const router = useRouter()
|
||||
|
||||
|
||||
const searchConfig = reactive([
|
||||
{
|
||||
label: '需求名称',
|
||||
@@ -76,7 +75,6 @@ const searchConfig = reactive([
|
||||
// colProps: {}
|
||||
// },
|
||||
])
|
||||
|
||||
const tableConfig = reactive({
|
||||
columns: [
|
||||
{
|
||||
@@ -85,7 +83,12 @@ const tableConfig = reactive({
|
||||
},
|
||||
{
|
||||
prop: 'requirementName',
|
||||
label: '名称',
|
||||
label: '征集名称',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
prop: 'projectName',
|
||||
label: '项目名称',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
@@ -99,7 +102,7 @@ const tableConfig = reactive({
|
||||
align: 'center',
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => {
|
||||
if (row.state !== null) {
|
||||
if (row.projectType !== null) {
|
||||
return (<Tag dictType={'project_type'} value={row.projectType}/>)
|
||||
} else {
|
||||
return '--'
|
||||
@@ -112,7 +115,7 @@ const tableConfig = reactive({
|
||||
align: 'center',
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => {
|
||||
if (row.state !== null) {
|
||||
if (row.rdSubject !== null) {
|
||||
return (<Tag dictType={'rd_subject'} value={row.rdSubject}/>)
|
||||
} else {
|
||||
return '--'
|
||||
@@ -125,7 +128,7 @@ const tableConfig = reactive({
|
||||
align: 'center',
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => {
|
||||
if (row.state !== null) {
|
||||
if (row.projectImpact !== null) {
|
||||
return (<Tag dictType={'project_impact'} value={row.projectImpact}/>)
|
||||
} else {
|
||||
return '--'
|
||||
@@ -167,9 +170,9 @@ const tableConfig = reactive({
|
||||
if (buttons.has("edit")) {
|
||||
btn.push({label: '编辑', prem: ['mosr:collect:resubmit'], func: () => handleEdit(row), type: 'primary'})
|
||||
}
|
||||
if (buttons.has("report")) {
|
||||
btn.push({label: '上报', prem: ['mosr:collect:reported'], func: () => handleAdd(row), type: 'primary'})
|
||||
}
|
||||
// if (buttons.has("report")) {
|
||||
// btn.push({label: '上报', prem: ['mosr:collect:reported'], func: () => handleAdd(row), type: 'primary'})
|
||||
// }
|
||||
return (
|
||||
<div style={{width: '100%'}}>
|
||||
{
|
||||
@@ -187,7 +190,7 @@ const tableConfig = reactive({
|
||||
{
|
||||
buttons.has("delete") ?
|
||||
<popover-delete name={row.requirementName} type={'需求'} btnType={'danger'}
|
||||
perm={['mosr:collect:del']} onDelete={() => handleDelete(row)}/>
|
||||
perm={['mosr:collect:del']} onDelete={() => handleDelete(row)}/>
|
||||
: ''
|
||||
}
|
||||
</div>
|
||||
@@ -198,10 +201,18 @@ const tableConfig = reactive({
|
||||
api: '/workflow/mosr/requirement/collect',
|
||||
params: {},
|
||||
btns: [
|
||||
{name: '年度计划导出', key: '_export', color: '#DED0B2', auth: ''},
|
||||
{name: '经费预算生成', key: 'preMonty', color: '#DED0B2', auth: ''},
|
||||
{name: '新增上报', key: 'add', color: '#DED0B2', auth: ''},
|
||||
{name: '年度计划导出', key: '_export', auth: ''},
|
||||
{name: '经费预算生成', key: 'preMonty', auth: ''},
|
||||
]
|
||||
})
|
||||
const headBtnClick = (key) => {
|
||||
switch (key) {
|
||||
case 'add':
|
||||
handleAdd()
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
const search = (val) => {
|
||||
let obj = {...val}
|
||||
@@ -214,11 +225,11 @@ const search = (val) => {
|
||||
tableIns.value.refresh()
|
||||
}
|
||||
|
||||
const handleAdd = (row) => {
|
||||
const handleAdd = () => {
|
||||
router.push({
|
||||
name: 'Summary/add',
|
||||
query: {
|
||||
id: row.requirementId
|
||||
// id: row.requirementId
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -235,7 +246,7 @@ const handleDetail = (row) => {
|
||||
router.push({
|
||||
name: 'Summary/detail',
|
||||
query: {
|
||||
id: row.requirementId,
|
||||
id: row.requirementId==null?'-1':row.requirementId,
|
||||
projectId: row.projectId,
|
||||
state: row.state
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<baseTitle title="上传附件"></baseTitle>
|
||||
<el-card style="width: 100%;margin: 15px 0">
|
||||
<file-upload @getFile="getFile"/>
|
||||
<fvTable style="width: 100%;max-height: 250px;height: 250px" v-if="showTable" :tableConfig="tableConfig"
|
||||
<fvTable style="width: 100%;max-height: 300px;" v-if="showTable" :tableConfig="tableConfig"
|
||||
:data="fileList" :isSettingCol="false" :pagination="false">
|
||||
<template #empty>
|
||||
<el-empty :image-size="90" description="暂无数据" style="padding: 0"/>
|
||||
@@ -82,6 +82,7 @@ const compositeParam = (item) => {
|
||||
originalFileName: item.originalFilename,
|
||||
fileType: item.fileType,
|
||||
url: item.url,
|
||||
newFile: true,
|
||||
tag:'需求上报',
|
||||
}
|
||||
}
|
||||
@@ -128,5 +129,7 @@ const handleSubmit = async () => {
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
:deep(.el-table--fit ){
|
||||
height: 300px!important;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,123 +1,109 @@
|
||||
<template>
|
||||
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
|
||||
<el-tab-pane label="需求征集" name="0">
|
||||
<el-tab-pane label="需求征集" name="00">
|
||||
<search-files-by-tag @search="searchRequirement" @upload="upload"
|
||||
:otherFileList="otherFileList"/>
|
||||
:otherFileList="otherFileList" :uploadState="uploadState"/>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="需求上报" name="1">
|
||||
<el-tab-pane label="需求上报" name="10">
|
||||
<search-files-by-tag @search="searchReport" @upload="upload"
|
||||
:otherFileList="otherFileList"/>
|
||||
:otherFileList="otherFileList" :uploadState="uploadState"/>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="项目立项" name="2">
|
||||
<el-tab-pane label="项目立项" name="20">
|
||||
<search-files-by-tag @search="searchInitiation" @upload="upload"
|
||||
:otherFileList="otherFileList"/>
|
||||
:otherFileList="otherFileList" :uploadState="uploadState"/>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="项目实施" name="3">
|
||||
<search-files-by-tag type="3" @search="searchImplementation" @upload="upload" ref="implementation"
|
||||
:otherFileList="otherFileList"/>
|
||||
<el-tab-pane label="项目实施" name="40">
|
||||
<search-files-by-tag type="40" @search="searchImplementation" @upload="upload" ref="implementation"
|
||||
:otherFileList="otherFileList" :uploadState="uploadState"/>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="项目归档" name="4">
|
||||
<el-tab-pane label="项目归档" name="50">
|
||||
<search-files-by-tag @search="searchFiling" @upload="upload"
|
||||
:otherFileList="otherFileList"/>
|
||||
:otherFileList="otherFileList" :uploadState="uploadState"/>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
import {searchFileList} from "@/api/project-manage/attachment.js";
|
||||
import {ElNotification} from "element-plus";
|
||||
import {getImplementationAttachment} from "@/api/project-manage";
|
||||
import {getRequirementAttachment} from "@/api/project-demand";
|
||||
import {getCollectAttachment} from "@/views/project-demand/summary/api";
|
||||
import {getFilingAttachment, getInitiationAttachment} from "@/api/project-manage";
|
||||
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
const activeName = ref('4')
|
||||
const activeName = ref('50')
|
||||
const attachment = ref({})
|
||||
const showTable = ref(true)
|
||||
const implementation = ref()
|
||||
const uploadState = ref(true)
|
||||
const otherFileList = ref([])
|
||||
const projectId = ref(route.query.id)
|
||||
const requirementId = ref(route.query.requirementId)
|
||||
const handleClick = (tab) => {
|
||||
let name = {}
|
||||
switchSearch(name, tab.index)
|
||||
switchSearch(tab.props.name)
|
||||
}
|
||||
const getParams = (param, type) => {
|
||||
let targetId
|
||||
let params
|
||||
if (type === 1) {
|
||||
targetId = route.query.requirementId
|
||||
params = {
|
||||
targetId: targetId,
|
||||
...param
|
||||
}
|
||||
} else if (type === 2){
|
||||
targetId = route.query.id
|
||||
if(JSON.stringify(param) !== '{}'){
|
||||
if (param.tag &&!param.name) {
|
||||
implementation.value.tagsOption?.forEach(item => {
|
||||
if (item.value === param.tag) {
|
||||
param.tag = item.label
|
||||
}
|
||||
})
|
||||
params = {
|
||||
targetId: targetId,
|
||||
tag:param.tag
|
||||
}
|
||||
}else if(!param.tag &¶m.name){
|
||||
params = {
|
||||
targetId: targetId,
|
||||
...param
|
||||
}
|
||||
} else if (!param.tag &&!param.name) {
|
||||
params = {
|
||||
targetId: targetId,
|
||||
}
|
||||
}
|
||||
}else {
|
||||
params = {
|
||||
targetId: targetId
|
||||
}
|
||||
}
|
||||
}else {
|
||||
targetId = route.query.id
|
||||
params = {
|
||||
targetId: targetId,
|
||||
...param
|
||||
}
|
||||
|
||||
const switchSearch = (index) => {
|
||||
switch (index) {
|
||||
case '00':
|
||||
searchRequirement({})
|
||||
break
|
||||
case '10':
|
||||
searchReport({})
|
||||
break
|
||||
case '20':
|
||||
searchInitiation({})
|
||||
break
|
||||
case '40':
|
||||
searchImplementation({})
|
||||
break
|
||||
case '50':
|
||||
searchFiling({})
|
||||
break
|
||||
}
|
||||
return params;
|
||||
}
|
||||
|
||||
const searchRequirement = async (param) => {
|
||||
await search(param)
|
||||
}
|
||||
const search = async (param, type) => {
|
||||
const res = await getRequirementAttachment(getParams(param, type))
|
||||
changeFileList(res)
|
||||
param.targetState = '00'
|
||||
param.targetId = projectId.value
|
||||
searchFileList(param).then(res => {
|
||||
changeFileList(res)
|
||||
})
|
||||
}
|
||||
|
||||
const searchReport = async (param) => {
|
||||
const res = await getCollectAttachment(getParams(param))
|
||||
changeFileList(res)
|
||||
param.targetState = '10'
|
||||
param.targetId = projectId.value
|
||||
searchFileList(param).then(res => {
|
||||
changeFileList(res)
|
||||
})
|
||||
}
|
||||
const searchInitiation = async (param) => {
|
||||
const res = await getInitiationAttachment(getParams(param))
|
||||
changeFileList(res)
|
||||
param.targetState = '20'
|
||||
param.targetId = projectId.value
|
||||
searchFileList(param).then(res => {
|
||||
changeFileList(res)
|
||||
})
|
||||
}
|
||||
|
||||
const searchImplementation = async (param) => {
|
||||
const res = await getImplementationAttachment(getParams(param,2))
|
||||
changeFileList(res)
|
||||
param.targetState = '40'
|
||||
param.targetId = projectId.value
|
||||
console.log('param',param)
|
||||
searchFileList(param).then(res => {
|
||||
changeFileList(res)
|
||||
})
|
||||
}
|
||||
const searchFiling = async (param) => {
|
||||
const res = await getFilingAttachment(getParams(param))
|
||||
changeFileList(res)
|
||||
param.targetState = '50'
|
||||
param.targetId = projectId.value
|
||||
searchFileList(param).then(res => {
|
||||
changeFileList(res)
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
const changeFileList = (res) => {
|
||||
showTable.value = false
|
||||
if (res.code === 1000) {
|
||||
otherFileList.value = res.data
|
||||
nextTick(() => {
|
||||
showTable.value = true
|
||||
})
|
||||
otherFileList.value = res.data.fileList
|
||||
uploadState.value = res.data.upload
|
||||
} else {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
@@ -126,16 +112,25 @@ const changeFileList = (res) => {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
onMounted(() => {
|
||||
if (activeName.value === '50') {
|
||||
searchFiling({})
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
const upload = () => {
|
||||
if(activeName.value==='3'){
|
||||
if (activeName.value === '40') {
|
||||
router.push({
|
||||
name: 'Implementation/upload',
|
||||
query: {
|
||||
id: route.query.id,
|
||||
type:'3'
|
||||
type: '40'
|
||||
}
|
||||
})
|
||||
}else {
|
||||
} else {
|
||||
router.push({
|
||||
name: switchUpload(activeName.value),
|
||||
query: {
|
||||
@@ -144,47 +139,20 @@ const upload = () => {
|
||||
})
|
||||
}
|
||||
}
|
||||
const switchUpload=(index)=>{
|
||||
const switchUpload = (index) => {
|
||||
switch (index) {
|
||||
case '0':
|
||||
case '00':
|
||||
return 'Requirement/upload';
|
||||
case '1':
|
||||
case '10':
|
||||
return 'Summary/upload';
|
||||
case '2':
|
||||
case '20':
|
||||
return 'Initiation/upload';
|
||||
case '3':
|
||||
case '40':
|
||||
return 'Implementation/upload';
|
||||
case '4':
|
||||
case '50':
|
||||
return 'Filing/upload';
|
||||
}
|
||||
}
|
||||
const switchSearch = (name, index) => {
|
||||
switch (index) {
|
||||
case '0':
|
||||
search(name, 1)
|
||||
break
|
||||
case '1':
|
||||
searchReport(name)
|
||||
break
|
||||
case '2':
|
||||
searchInitiation(name)
|
||||
break
|
||||
case '3':
|
||||
searchImplementation(name)
|
||||
break
|
||||
case '4':
|
||||
searchFiling(name)
|
||||
break
|
||||
}
|
||||
}
|
||||
onMounted(() => {
|
||||
if (activeName.value === '4') {
|
||||
let name = {
|
||||
name: ''
|
||||
}
|
||||
searchFiling(name)
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
|
||||
214
src/views/project-management/filing/attachment45.vue
Normal file
@@ -0,0 +1,214 @@
|
||||
<template>
|
||||
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
|
||||
<el-tab-pane label="需求征集" name="0">
|
||||
<search-files-by-tag @search="searchRequirement" @upload="upload"
|
||||
:otherFileList="otherFileList"/>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="需求上报" name="1">
|
||||
<search-files-by-tag @search="searchReport" @upload="upload"
|
||||
:otherFileList="otherFileList"/>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="项目立项" name="2">
|
||||
<search-files-by-tag @search="searchInitiation" @upload="upload"
|
||||
:otherFileList="otherFileList"/>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="项目实施" name="3">
|
||||
<search-files-by-tag type="3" @search="searchImplementation" @upload="upload" ref="implementation"
|
||||
:otherFileList="otherFileList"/>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="项目归档" name="4">
|
||||
<search-files-by-tag @search="searchFiling" @upload="upload"
|
||||
:otherFileList="otherFileList"/>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
import {ElNotification} from "element-plus";
|
||||
import {getImplementationAttachment} from "@/api/project-manage";
|
||||
import {getRequirementAttachment} from "@/api/project-demand";
|
||||
import {getCollectAttachment} from "@/views/project-demand/summary/api";
|
||||
import {getFilingAttachment, getInitiationAttachment} from "@/api/project-manage";
|
||||
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
const activeName = ref('4')
|
||||
const attachment = ref({})
|
||||
const showTable = ref(true)
|
||||
const implementation = ref()
|
||||
const otherFileList = ref([])
|
||||
const handleClick = (tab) => {
|
||||
let name = {}
|
||||
switchSearch(name, tab.index)
|
||||
}
|
||||
const getParams = (param, type) => {
|
||||
let targetId
|
||||
let params
|
||||
if (type === 1) {
|
||||
targetId = route.query.requirementId
|
||||
params = {
|
||||
targetId: targetId,
|
||||
...param
|
||||
}
|
||||
} else if (type === 2){
|
||||
targetId = route.query.id
|
||||
if(JSON.stringify(param) !== '{}'){
|
||||
if (param.tag &&!param.name) {
|
||||
implementation.value.tagsOption?.forEach(item => {
|
||||
if (item.value === param.tag) {
|
||||
param.tag = item.label
|
||||
}
|
||||
})
|
||||
params = {
|
||||
targetId: targetId,
|
||||
tag:param.tag
|
||||
}
|
||||
}else if(!param.tag &¶m.name){
|
||||
params = {
|
||||
targetId: targetId,
|
||||
...param
|
||||
}
|
||||
} else if (!param.tag &&!param.name) {
|
||||
params = {
|
||||
targetId: targetId,
|
||||
}
|
||||
}
|
||||
}else {
|
||||
params = {
|
||||
targetId: targetId
|
||||
}
|
||||
}
|
||||
}else {
|
||||
targetId = route.query.id
|
||||
params = {
|
||||
targetId: targetId,
|
||||
...param
|
||||
}
|
||||
}
|
||||
return params;
|
||||
}
|
||||
|
||||
const searchRequirement = async (param) => {
|
||||
await search(param)
|
||||
}
|
||||
const search = async (param, type) => {
|
||||
const res = await getRequirementAttachment(getParams(param, type))
|
||||
changeFileList(res)
|
||||
}
|
||||
const searchReport = async (param) => {
|
||||
const res = await getCollectAttachment(getParams(param))
|
||||
changeFileList(res)
|
||||
}
|
||||
const searchInitiation = async (param) => {
|
||||
const res = await getInitiationAttachment(getParams(param))
|
||||
changeFileList(res)
|
||||
}
|
||||
const searchImplementation = async (param) => {
|
||||
const res = await getImplementationAttachment(getParams(param,2))
|
||||
changeFileList(res)
|
||||
}
|
||||
const searchFiling = async (param) => {
|
||||
const res = await getFilingAttachment(getParams(param))
|
||||
changeFileList(res)
|
||||
}
|
||||
const changeFileList = (res) => {
|
||||
showTable.value = false
|
||||
if (res.code === 1000) {
|
||||
otherFileList.value = res.data
|
||||
nextTick(() => {
|
||||
showTable.value = true
|
||||
})
|
||||
} else {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: 'error'
|
||||
})
|
||||
}
|
||||
}
|
||||
const upload = () => {
|
||||
if(activeName.value==='3'){
|
||||
router.push({
|
||||
name: 'Implementation/upload',
|
||||
query: {
|
||||
id: route.query.id,
|
||||
type:'3'
|
||||
}
|
||||
})
|
||||
}else {
|
||||
router.push({
|
||||
name: switchUpload(activeName.value),
|
||||
query: {
|
||||
id: route.query.id
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
const switchUpload=(index)=>{
|
||||
switch (index) {
|
||||
case '0':
|
||||
return 'Requirement/upload';
|
||||
case '1':
|
||||
return 'Summary/upload';
|
||||
case '2':
|
||||
return 'Initiation/upload';
|
||||
case '3':
|
||||
return 'Implementation/upload';
|
||||
case '4':
|
||||
return 'Filing/upload';
|
||||
}
|
||||
}
|
||||
const switchSearch = (name, index) => {
|
||||
switch (index) {
|
||||
case '0':
|
||||
search(name, 1)
|
||||
break
|
||||
case '1':
|
||||
searchReport(name)
|
||||
break
|
||||
case '2':
|
||||
searchInitiation(name)
|
||||
break
|
||||
case '3':
|
||||
searchImplementation(name)
|
||||
break
|
||||
case '4':
|
||||
searchFiling(name)
|
||||
break
|
||||
}
|
||||
}
|
||||
onMounted(() => {
|
||||
if (activeName.value === '4') {
|
||||
let name = {
|
||||
name: ''
|
||||
}
|
||||
searchFiling(name)
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
:deep(.el-tabs__header) {
|
||||
margin: 15px 0 30px 0;
|
||||
}
|
||||
|
||||
:deep(.el-tabs__nav-scroll) {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
|
||||
.el-tabs__nav {
|
||||
display: flex;
|
||||
flex: 1;
|
||||
|
||||
.el-tabs__item {
|
||||
flex: 1;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.is-active {
|
||||
color: black;
|
||||
//background-color: #DED0B2;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
94
src/views/project-management/filing/attachment56.vue
Normal file
@@ -0,0 +1,94 @@
|
||||
<template>
|
||||
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
|
||||
<el-tab-pane label="需求征集" name="00">
|
||||
<search-files-by-tag @search="searchRequirement" @upload="upload"
|
||||
:otherFileList="otherFileList"/>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="需求上报" name="10">
|
||||
<search-files-by-tag @search="searchReport" @upload="upload"
|
||||
:otherFileList="otherFileList"/>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="项目立项" name="20">
|
||||
<search-files-by-tag @search="searchInitiation" @upload="upload"
|
||||
:otherFileList="otherFileList"/>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="项目实施" name="40">
|
||||
<search-files-by-tag type="3" @search="searchImplementation" @upload="upload" ref="implementation"
|
||||
:otherFileList="otherFileList"/>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="项目归档" name="50">
|
||||
<search-files-by-tag @search="searchFiling" @upload="upload"
|
||||
:otherFileList="otherFileList"/>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
import {searchFileList} from "@/api/project-manage/attachment.js";
|
||||
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
const activeName = ref('4')
|
||||
const attachment = ref({})
|
||||
const showTable = ref(true)
|
||||
const implementation = ref()
|
||||
const otherFileList = ref([])
|
||||
const handleClick = (tab) => {
|
||||
let name = {}
|
||||
switchSearch(name, tab.index)
|
||||
}
|
||||
|
||||
const switchSearch = (name, index) => {
|
||||
switch (index) {
|
||||
case '0':
|
||||
search(name, 1)
|
||||
break
|
||||
case '1':
|
||||
searchReport(name)
|
||||
break
|
||||
case '2':
|
||||
searchInitiation(name)
|
||||
break
|
||||
case '3':
|
||||
searchImplementation(name)
|
||||
break
|
||||
case '4':
|
||||
searchFiling(name)
|
||||
break
|
||||
}
|
||||
}
|
||||
onMounted(() => {
|
||||
if (activeName.value === '4') {
|
||||
let name = {
|
||||
name: ''
|
||||
}
|
||||
searchFiling(name)
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
:deep(.el-tabs__header) {
|
||||
margin: 15px 0 30px 0;
|
||||
}
|
||||
|
||||
:deep(.el-tabs__nav-scroll) {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
|
||||
.el-tabs__nav {
|
||||
display: flex;
|
||||
flex: 1;
|
||||
|
||||
.el-tabs__item {
|
||||
flex: 1;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.is-active {
|
||||
color: black;
|
||||
//background-color: #DED0B2;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -69,19 +69,18 @@ const tableConfig = reactive({
|
||||
align: 'center',
|
||||
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
|
||||
},
|
||||
// {
|
||||
// prop: 'oper',
|
||||
// label: '操作',
|
||||
// align: 'center',
|
||||
// currentRender: ({row, index}) => {
|
||||
// return (
|
||||
// <div>
|
||||
// <el-button type="primary" link onClick={() => handleDownload(row)}>下载</el-button>
|
||||
// <el-button type="primary" size="large" link onClick={() => beforeRemove(row)}>删除</el-button>
|
||||
// </div>
|
||||
// )
|
||||
// }
|
||||
// }
|
||||
{
|
||||
prop: 'oper',
|
||||
label: '操作',
|
||||
align: 'center',
|
||||
currentRender: ({row, index}) => {
|
||||
return (
|
||||
<div>
|
||||
<el-button type="primary" link onClick={() => handleDownload(row)}>下载</el-button>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
||||
]
|
||||
})
|
||||
const handleDownload = (row) => {
|
||||
@@ -104,6 +103,7 @@ const compositeParam = (item) => {
|
||||
originalFileName: item.originalFilename,
|
||||
fileType: item.fileType,
|
||||
url: item.url,
|
||||
newFile: true,
|
||||
tag: tag
|
||||
}
|
||||
}
|
||||
@@ -128,12 +128,6 @@ const getFileParam = (item) => {
|
||||
}
|
||||
}
|
||||
const handleSubmit = async () => {
|
||||
// if (JSON.stringify(file.value) === "{}") {
|
||||
// attachment.value.validate()
|
||||
// return;
|
||||
// } else {
|
||||
// attachment.value.clearValidate()
|
||||
// }
|
||||
let files = []
|
||||
let singleFile = {}
|
||||
if (file.value.fileId !== undefined) {
|
||||
@@ -180,12 +174,6 @@ const handleResubmit = () => {
|
||||
let singleFile = {}
|
||||
let otherFiles = []
|
||||
let fileArray
|
||||
// if (JSON.stringify(file.value) === "{}" || attachment.value.singleFile === null) {
|
||||
// attachment.value.validate()
|
||||
// return;
|
||||
// } else {
|
||||
// attachment.value.clearValidate()
|
||||
// }
|
||||
if (attachment.value.singleFile !== null && name.value === 'Filing/edit') {
|
||||
singleFile = {
|
||||
fileId: attachment.value.singleFile.fileId
|
||||
|
||||
@@ -9,13 +9,13 @@
|
||||
:loading="loading"
|
||||
/>
|
||||
<summary-detail v-show="showActive == '10'" :formData="commonForm.formData" :data="commonForm"
|
||||
:processViewer="commonProvessViewer" :loading="loading"/>
|
||||
:processViewer="commonProvessViewer" :loading="loading" :fileListShow="fileListShow"/>
|
||||
<ApprovalDetail type="approval" v-show="showActive == '20'" :formData="commonForm.formData" :data="commonForm"
|
||||
:processViewer="commonProvessViewer" :loading="loading"></ApprovalDetail>
|
||||
:processViewer="commonProvessViewer" :loading="loading" :fileListShow="fileListShow"/>
|
||||
<ApprovalDetail type="execute" v-show="showActive == '40'" :formData="commonForm.formData" :data="commonForm"
|
||||
:processViewer="commonProvessViewer" :loading="loading"></ApprovalDetail>
|
||||
:processViewer="commonProvessViewer" :loading="loading" :fileListShow="fileListShow"/>
|
||||
<ApprovalDetail type="archivist" v-show="showActive == '50'" :formData="commonForm.formData" :data="commonForm"
|
||||
:processViewer="commonProvessViewer" :loading="loading"></ApprovalDetail>
|
||||
:processViewer="commonProvessViewer" :loading="loading" :fileListShow="fileListShow"/>
|
||||
</template>
|
||||
</steps>
|
||||
<opinion v-if="commonForm.taskId" :formData="commonForm.formData" :taskId="commonForm.taskId"/>
|
||||
@@ -36,6 +36,7 @@ const loading = ref(false)
|
||||
const processStore = useProcessStore()
|
||||
const activeName = ref('first')
|
||||
const commonForm = ref({})
|
||||
const fileListShow = ref('READ')
|
||||
const commonProvessViewer = ref(true)
|
||||
|
||||
const getAllInfo = async (state) => {
|
||||
@@ -43,17 +44,17 @@ const getAllInfo = async (state) => {
|
||||
try {
|
||||
commonProvessViewer.value = false
|
||||
loading.value = true
|
||||
const {data, code,msg} = await getMapProjectStateInfo(route.query.projectId, state)
|
||||
if(code===1000){
|
||||
const {data, code, msg} = await getMapProjectStateInfo(route.query.projectId, state)
|
||||
if (code === 1000) {
|
||||
loading.value = false
|
||||
}else {
|
||||
} else {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: msg,
|
||||
type: 'error'
|
||||
type: 'error'
|
||||
})
|
||||
}
|
||||
if(data===undefined)return;
|
||||
if (data === undefined) return;
|
||||
commonForm.value = data
|
||||
processStore.setDesign(data)
|
||||
processStore.runningList.value = data.runningList;
|
||||
@@ -63,6 +64,9 @@ const getAllInfo = async (state) => {
|
||||
processStore.passList.value = data.passList;
|
||||
nextTick(() => {
|
||||
commonProvessViewer.value = true
|
||||
if (data.formPermMap["fileList"]) {
|
||||
fileListShow.value = data.formPermMap["fileList"].perm
|
||||
}
|
||||
})
|
||||
loading.close()
|
||||
} catch {
|
||||
|
||||
@@ -156,7 +156,7 @@ const tableConfig = reactive({
|
||||
align: 'center',
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => {
|
||||
if (row.state !== null) {
|
||||
if (row.projectType !== null) {
|
||||
return (<Tag dictType={'project_type'} value={row.projectType}/>)
|
||||
} else {
|
||||
return '--'
|
||||
@@ -169,7 +169,7 @@ const tableConfig = reactive({
|
||||
align: 'center',
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => {
|
||||
if (row.state !== null) {
|
||||
if (row.rdSubject !== null) {
|
||||
return (<Tag dictType={'rd_subject'} value={row.rdSubject}/>)
|
||||
} else {
|
||||
return '--'
|
||||
@@ -182,7 +182,7 @@ const tableConfig = reactive({
|
||||
align: 'center',
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => {
|
||||
if (row.state !== null) {
|
||||
if (row.projectImpact !== null) {
|
||||
return (<Tag dictType={'project_impact'} value={row.projectImpact}/>)
|
||||
} else {
|
||||
return '--'
|
||||
@@ -191,7 +191,7 @@ const tableConfig = reactive({
|
||||
},
|
||||
{
|
||||
prop: 'economicEstimate',
|
||||
label: '经济概算(万元)',
|
||||
label: '经济概算(元)',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<baseTitle title="上传附件"></baseTitle>
|
||||
<el-card style="width: 100%;margin: 15px 0">
|
||||
<file-upload @getFile="getFile" />
|
||||
<fvTable style="width: 100%;max-height: 250px;height: 250px" v-if="showTable" :tableConfig="tableConfig"
|
||||
<fvTable style="width: 100%;max-height: 300px;" v-if="showTable" :tableConfig="tableConfig"
|
||||
:data="fileList" :isSettingCol="false" :pagination="false">
|
||||
<template #empty>
|
||||
<el-empty :image-size="90" description="暂无数据" style="padding: 0"/>
|
||||
@@ -82,6 +82,7 @@ const compositeParam = (item) => {
|
||||
originalFileName: item.originalFilename,
|
||||
fileType: item.fileType,
|
||||
url: item.url,
|
||||
newFile: true,
|
||||
tag: '项目归档',
|
||||
}
|
||||
}
|
||||
@@ -127,5 +128,7 @@ const handleSubmit = async () => {
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
:deep(.el-table--fit ){
|
||||
height: 300px!important;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -89,10 +89,6 @@ const tableConfig = reactive({
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
prop: 'projectName',
|
||||
label: '项目名称',
|
||||
align: 'center'
|
||||
},{
|
||||
prop: 'time',
|
||||
label: '时间',
|
||||
align: 'center'
|
||||
@@ -100,12 +96,28 @@ const tableConfig = reactive({
|
||||
{
|
||||
prop: 'projectCost',
|
||||
label: '项目费用',
|
||||
align: 'center'
|
||||
align: 'center',
|
||||
currentRender: ({row, index}) => {
|
||||
if (row.projectCost !== null) {
|
||||
return (<Tag dictType={'project_cost'} value={row.projectCost}/>)
|
||||
} else {
|
||||
return '--'
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
prop: 'researchStage',
|
||||
label: '研发阶段',
|
||||
align: 'center'
|
||||
align: 'center',
|
||||
currentRender: ({row, index}) => {
|
||||
console.log('row.researchStage',row.researchStage)
|
||||
if (row.researchStage&&row.researchStage !== null&&row.researchStage!==undefined) {
|
||||
console.log('ull',row.researchStage)
|
||||
return (<Tag dictType={'research_stage'} value={row.researchStage}/>)
|
||||
} else {
|
||||
return '--'
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
prop: 'digest',
|
||||
|
||||
@@ -56,6 +56,7 @@ const compositeParam = (item) => {
|
||||
originalFileName: item.originalFilename,
|
||||
fileType: item.fileType,
|
||||
url: item.url,
|
||||
newFile: true,
|
||||
tag: tag
|
||||
}
|
||||
}
|
||||
@@ -82,13 +83,6 @@ const getFileParam = (item) => {
|
||||
const handleSubmit = (instance) => {
|
||||
if (!instance) return
|
||||
instance.validate(async (valid) => {
|
||||
if (!valid) return
|
||||
if(JSON.stringify(file.value) === "{}"){
|
||||
attachment.value.validate()
|
||||
return;
|
||||
}else {
|
||||
attachment.value.clearValidate()
|
||||
}
|
||||
if (!valid) return
|
||||
let files = []
|
||||
let singleFile={}
|
||||
@@ -149,12 +143,6 @@ const handleResubmit = (instance) => {
|
||||
let singleFile = {}
|
||||
let otherFiles = []
|
||||
let fileArray
|
||||
// if (JSON.stringify(file.value) === "{}"||attachment.value.singleFile===null) {
|
||||
// attachment.value.validate()
|
||||
// return;
|
||||
// } else {
|
||||
// attachment.value.clearValidate()
|
||||
// }
|
||||
if (attachment.value.singleFile!==null&&name.value === 'Implementation/edit') {
|
||||
singleFile = {
|
||||
fileId: attachment.value.singleFile.fileId
|
||||
|
||||
@@ -1,18 +1,24 @@
|
||||
<template>
|
||||
<steps :active="cuurentStep" @setDetail="setDetail" @stepChange="stepChange">
|
||||
<steps :active="route.query.id==='-1'?currentStep-1:currentStep" @setDetail="setDetail" @stepChange="stepChange"
|
||||
:reportType="route.query.id==='-1'?'direct':''">
|
||||
<template #content>
|
||||
<collection-detail
|
||||
:formData="commonForm.formData"
|
||||
:data="commonForm"
|
||||
:processViewer="commonProvessViewer"
|
||||
v-show="showActive == '00'"
|
||||
:loading="loading"
|
||||
:formData="commonForm.formData"
|
||||
:data="commonForm"
|
||||
:processViewer="commonProvessViewer"
|
||||
v-show="showActive == '00'"
|
||||
:loading="loading"
|
||||
/>
|
||||
<summary-detail v-show="showActive == '10'" :formData="commonForm.formData" :data="commonForm" :processViewer="commonProvessViewer" :loading="loading"/>
|
||||
<ApprovalDetail type="approval" v-show="showActive == '20'" :formData="commonForm.formData" :data="commonForm" :processViewer="commonProvessViewer" :loading="loading"></ApprovalDetail>
|
||||
<ApprovalDetail type="execute" v-show="showActive == '40'" :formData="commonForm.formData" :data="commonForm" :processViewer="commonProvessViewer" :loading="loading"></ApprovalDetail>
|
||||
<summary-detail v-show="showActive == '10'" :formData="commonForm.formData" :data="commonForm"
|
||||
:processViewer="commonProvessViewer" :loading="loading" :fileListShow="fileListShow"/>
|
||||
<ApprovalDetail type="approval" v-show="showActive == '20'" :formData="commonForm.formData"
|
||||
:data="commonForm" :processViewer="commonProvessViewer" :loading="loading"
|
||||
:fileListShow="fileListShow"/>
|
||||
<ApprovalDetail type="execute" v-show="showActive == '40'" :formData="commonForm.formData"
|
||||
:data="commonForm" :processViewer="commonProvessViewer" :loading="loading"
|
||||
:fileListShow="fileListShow"/>
|
||||
<ApprovalDetail type="archivist" v-show="showActive == '50'" :formData="commonForm.formData" :data="commonForm"
|
||||
:processViewer="commonProvessViewer" :loading="loading"></ApprovalDetail>
|
||||
:processViewer="commonProvessViewer" :loading="loading" :fileListShow="fileListShow"/>
|
||||
|
||||
</template>
|
||||
</steps>
|
||||
@@ -24,7 +30,7 @@ import {useProcessStore} from '@/stores/processStore.js';
|
||||
import CollectionDetail from "@/components/DetailComponent/CollectionDetail.vue";
|
||||
import SummaryDetail from "@/components/DetailComponent/SummaryDetail.vue";
|
||||
import ApprovalDetail from "@/components/DetailComponent/ApprovalDetail.vue";
|
||||
import { getMapProjectStateInfo } from '@/components/steps/api';
|
||||
import {getMapProjectStateInfo} from '@/components/steps/api';
|
||||
import {ElLoading, ElNotification} from "element-plus";
|
||||
import Opinion from "@/components/DetailComponent/Opinion.vue";
|
||||
|
||||
@@ -32,11 +38,12 @@ const route = useRoute()
|
||||
const activeName = ref('first')
|
||||
const loading = ref(false)
|
||||
const processStore = useProcessStore()
|
||||
const cuurentStep = ref()
|
||||
route.query.step == '10' && (cuurentStep.value = 1)
|
||||
route.query.step == '20' && (cuurentStep.value = 2)
|
||||
route.query.step == '40' && (cuurentStep.value = 3)
|
||||
route.query.step == '50' && (cuurentStep.value = 4)
|
||||
const fileListShow = ref('READ')
|
||||
const currentStep = ref()
|
||||
route.query.step == '10' && (currentStep.value = 1)
|
||||
route.query.step == '20' && (currentStep.value = 2)
|
||||
route.query.step == '40' && (currentStep.value = 3)
|
||||
route.query.step == '50' && (currentStep.value = 4)
|
||||
const showActive = ref()
|
||||
const commonForm = ref({})
|
||||
const commonProvessViewer = ref(true)
|
||||
@@ -46,18 +53,18 @@ const getAllInfo = async (state) => {
|
||||
try {
|
||||
commonProvessViewer.value = false
|
||||
loading.value = true
|
||||
const { data, code ,msg} = await getMapProjectStateInfo(route.query.projectId, state)
|
||||
if(code===1000){
|
||||
const {data, code, msg} = await getMapProjectStateInfo(route.query.projectId, state)
|
||||
if (code === 1000) {
|
||||
loading.value = false
|
||||
}else {
|
||||
} else {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: msg,
|
||||
type: 'error'
|
||||
type: 'error'
|
||||
})
|
||||
loading.close()
|
||||
}
|
||||
if(data===undefined)return;
|
||||
if (data === undefined) return;
|
||||
commonForm.value = data
|
||||
processStore.setDesign(data)
|
||||
processStore.runningList.value = data.runningList;
|
||||
@@ -67,6 +74,9 @@ const getAllInfo = async (state) => {
|
||||
processStore.passList.value = data.passList;
|
||||
nextTick(() => {
|
||||
commonProvessViewer.value = true
|
||||
if (data.formPermMap["fileList"]) {
|
||||
fileListShow.value = data.formPermMap["fileList"].perm
|
||||
}
|
||||
})
|
||||
loading.close()
|
||||
} catch {
|
||||
@@ -87,19 +97,23 @@ const stepChange = (data) => {
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.detail-block{
|
||||
.detail-block {
|
||||
padding-top: 15px;
|
||||
:deep(.el-tabs__nav-scroll){
|
||||
|
||||
:deep(.el-tabs__nav-scroll) {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
.el-tabs__nav{
|
||||
|
||||
.el-tabs__nav {
|
||||
display: flex;
|
||||
flex: 1;
|
||||
.el-tabs__item{
|
||||
|
||||
.el-tabs__item {
|
||||
flex: 1;
|
||||
font-size: 16px;
|
||||
}
|
||||
.is-active{
|
||||
|
||||
.is-active {
|
||||
color: black;
|
||||
background-color: #DED0B2;
|
||||
}
|
||||
|
||||
@@ -161,7 +161,7 @@ const tableConfig = reactive({
|
||||
align: 'center',
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => {
|
||||
if (row.state !== null) {
|
||||
if (row.projectType !== null) {
|
||||
return (<Tag dictType={'project_type'} value={row.projectType}/>)
|
||||
} else {
|
||||
return '--'
|
||||
@@ -174,7 +174,7 @@ const tableConfig = reactive({
|
||||
align: 'center',
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => {
|
||||
if (row.state !== null) {
|
||||
if (row.rdSubject !== null) {
|
||||
return (<Tag dictType={'rd_subject'} value={row.rdSubject}/>)
|
||||
} else {
|
||||
return '--'
|
||||
@@ -187,7 +187,7 @@ const tableConfig = reactive({
|
||||
align: 'center',
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => {
|
||||
if (row.state !== null) {
|
||||
if (row.projectImpact !== null) {
|
||||
return (<Tag dictType={'project_impact'} value={row.projectImpact}/>)
|
||||
} else {
|
||||
return '--'
|
||||
@@ -196,7 +196,7 @@ const tableConfig = reactive({
|
||||
},
|
||||
{
|
||||
prop: 'economicEstimate',
|
||||
label: '经济概算(万元)',
|
||||
label: '经济概算(元)',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
|
||||
@@ -47,6 +47,7 @@ const compositeParam = (item) => {
|
||||
originalFileName: item.originalFilename,
|
||||
fileType: item.fileType,
|
||||
url: item.url,
|
||||
newFile: true,
|
||||
tag: tag
|
||||
}
|
||||
}
|
||||
@@ -119,11 +120,6 @@ const handleSubmit = (instance) => {
|
||||
|
||||
const init = async () => {
|
||||
const {msg, code,data} = await getProjectCheckProcess(route.query.projectId)
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: msg,
|
||||
type: code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
processDiagramViewer.value = false
|
||||
if (code === 1000) {
|
||||
deploymentId.value = data.deploymentId
|
||||
@@ -137,6 +133,12 @@ const init = async () => {
|
||||
nextTick(() => {
|
||||
processDiagramViewer.value = true
|
||||
})
|
||||
}else {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: msg,
|
||||
type:'error'
|
||||
})
|
||||
}
|
||||
}
|
||||
onMounted(async () => {
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
import {reactive} from "vue";
|
||||
import fvSelect from '@/fvcomponents/fvSelect/index.vue'
|
||||
|
||||
const searchConfig = reactive([
|
||||
{
|
||||
@@ -24,13 +24,14 @@ const searchConfig = reactive([
|
||||
},
|
||||
{
|
||||
label: '项目费用',
|
||||
prop: 'requirementName',
|
||||
component: 'el-input',
|
||||
prop: 'projectCost',
|
||||
component: shallowRef(fvSelect),
|
||||
props: {
|
||||
placeholder: '请输入项目费用查询',
|
||||
placeholder: '请选择项目费用查询',
|
||||
clearable: true,
|
||||
filterable: true,
|
||||
checkStrictly: true
|
||||
checkStrictly: true,
|
||||
cacheKey: 'project_cost'
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -59,38 +60,38 @@ const tableConfig = reactive({
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
prop: 'projectType',
|
||||
prop: 'researchPersonnel',
|
||||
label: '研发人员',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
prop: 'productMainBody',
|
||||
prop: 'wagesPayable',
|
||||
label: '应发工资',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
prop: 'projectEffect',
|
||||
prop: 'performance',
|
||||
label: '绩效',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
prop: 'survey',
|
||||
prop: 'reserveFund',
|
||||
label: '公积金',
|
||||
align: 'center'
|
||||
},{
|
||||
prop: 'survey',
|
||||
prop: 'socialSecurity',
|
||||
label: '社保',
|
||||
align: 'center'
|
||||
},{
|
||||
prop: 'survey',
|
||||
prop: 'annuity',
|
||||
label: '年金',
|
||||
align: 'center'
|
||||
},{
|
||||
prop: 'survey',
|
||||
prop: 'workday',
|
||||
label: '工作日(天)',
|
||||
align: 'center'
|
||||
},{
|
||||
prop: 'survey',
|
||||
prop: 'researchDuration',
|
||||
label: '研发工时(天)',
|
||||
align: 'center'
|
||||
},{
|
||||
@@ -101,9 +102,6 @@ const tableConfig = reactive({
|
||||
],
|
||||
api: '',
|
||||
params: {},
|
||||
btns: [
|
||||
{name: '上传分摊', key: '_export', color: '#DED0B2',auth: ''}
|
||||
]
|
||||
})
|
||||
|
||||
</script>
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
<baseTitle title="其他文件"></baseTitle>
|
||||
<el-card style="width: 100%;margin: 15px 0">
|
||||
<file-upload @getFile="getFile" :disabled="!formData.tagName" :title="!formData.tagName?'请先选择/输入标签!':''"/>
|
||||
<fvTable style="width: 100%;max-height: 250px;height: 250px" v-if="showTable" :tableConfig="tableConfig"
|
||||
<fvTable style="width: 100%;max-height: 300px;" v-if="showTable" :tableConfig="tableConfig"
|
||||
:data="fileList" :isSettingCol="false" :pagination="false">
|
||||
<template #empty>
|
||||
<el-empty :image-size="90" description="暂无数据" style="padding: 0"/>
|
||||
@@ -85,7 +85,7 @@ const showTable = ref(true)
|
||||
const tagForm = ref()
|
||||
const name = ref(router.currentRoute.value.name)
|
||||
const rules = reactive({
|
||||
tagName: [{required: true, message: '请输入标签名称', trigger: 'blur'}],
|
||||
tagName: [{required: true, message: '请输入标签名称', trigger: ['blur', 'change']}],
|
||||
})
|
||||
const changeInput=()=>{
|
||||
showInput.value=!showInput.value;
|
||||
@@ -121,6 +121,7 @@ const compositeParam = (item) => {
|
||||
originalFileName: item.originalFilename,
|
||||
fileType: item.fileType,
|
||||
url: item.url,
|
||||
newFile: true,
|
||||
tag: formData.value.tagName,
|
||||
}
|
||||
}
|
||||
@@ -160,7 +161,7 @@ const handleSubmit = async (instance) => {
|
||||
})
|
||||
if (res.code === 1000) {
|
||||
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
||||
if(route.query.type=='3'){
|
||||
if(route.query.type==='40'){
|
||||
await router.push({
|
||||
name: 'Filing/attachment',
|
||||
query:{
|
||||
@@ -182,5 +183,7 @@ getTagsOption()
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
:deep(.el-table--fit ){
|
||||
height: 300px!important;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -2,14 +2,6 @@
|
||||
<baseTitle title="上传费用"></baseTitle>
|
||||
<el-form :model="tableForm" ref="form">
|
||||
<el-table :data="tableForm.tableData" style="width: 100%">
|
||||
<el-table-column prop="projectName" label="项目名称">
|
||||
<template #default="scope">
|
||||
<el-form-item prop="projectName" :rules="scope.row.projectName?'1':rules.projectName">
|
||||
<el-input v-model="scope.row.projectName" placeholder="请输入项目名称" clearable>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="time" label="时间">
|
||||
<template #default="scope">
|
||||
<el-form-item prop="time" :rules="scope.row.time?'1':rules.time">
|
||||
@@ -93,33 +85,21 @@ import {useCacheStore} from '@/stores/cache.js'
|
||||
|
||||
const cacheStore = useCacheStore()
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
const tagsViewStore = useTagsView()
|
||||
const formData = ref({})
|
||||
const form = ref()
|
||||
const rules = reactive({
|
||||
projectName: [{required: true, message: '请输入项目名称', trigger:"blur"}],
|
||||
time: [{required: true, message: '请选择时间', trigger: 'blur'}],
|
||||
projectCost: [{required: true, message: '请输入项目费用', trigger: 'blur'}],
|
||||
researchStage: [{required: true, message: '请输入研发阶段', trigger: 'blur'}],
|
||||
digest: [{required: true, message: '请输入摘要', trigger: 'blur'}],
|
||||
afterTax: [{required: true, message: '请输入税后余额', trigger: 'blur'}]
|
||||
})
|
||||
const tableData=ref([
|
||||
{
|
||||
projectId: route.query.id,
|
||||
projectName: '',
|
||||
time: '',
|
||||
projectCost: '',
|
||||
researchStage: '',
|
||||
digest: '',
|
||||
afterTax: ''
|
||||
}
|
||||
])
|
||||
const tableForm = reactive({
|
||||
tableData: [
|
||||
{
|
||||
projectId: route.query.id,
|
||||
projectName: '',
|
||||
time: '',
|
||||
projectCost: '',
|
||||
researchStage: '',
|
||||
@@ -131,36 +111,38 @@ const tableForm = reactive({
|
||||
const handleAdd = () => {
|
||||
let row = {
|
||||
projectId: route.query.id,
|
||||
projectName: '',
|
||||
time: '',
|
||||
projectCost: '',
|
||||
researchStage: '',
|
||||
digest: '',
|
||||
afterTax: ''
|
||||
}
|
||||
tableData.value.push(row)
|
||||
tableForm.tableData.push(row)
|
||||
}
|
||||
const handleDelete = (index) => {
|
||||
tableData.value.splice(index, 1)
|
||||
tableForm.tableData.splice(index, 1)
|
||||
}
|
||||
const handleSubmit = (instance) => {
|
||||
if (!instance) return
|
||||
instance.validate(async (valid) => {
|
||||
if (!valid) return
|
||||
instance.clearValidate()
|
||||
console.log('params', tableData.value)
|
||||
// const res = addLedger(tableData.value)
|
||||
// ElNotification({
|
||||
// title: '提示',
|
||||
// message: res.msg,
|
||||
// type: res.code === 1000 ? 'success' : 'error'
|
||||
// })
|
||||
// if (res.code === 1000) {
|
||||
// tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
||||
// router.push({
|
||||
// name: 'Implementation'
|
||||
// })
|
||||
// }
|
||||
console.log('params', tableForm.tableData)
|
||||
const res =await addLedger(tableForm.tableData)
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
if (res.code === 1000) {
|
||||
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
||||
router.push({
|
||||
name: 'Implementation/account',
|
||||
query:{
|
||||
id:route.query.id
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
const handleBack = () => {
|
||||
|
||||
@@ -27,10 +27,11 @@
|
||||
|
||||
<script setup lang="jsx">
|
||||
import {useTagsView} from '@/stores/tagsview.js'
|
||||
import {ElMessage, ElNotification} from "element-plus";
|
||||
import { ElNotification} from "element-plus";
|
||||
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue';
|
||||
import {getApplyProcess, projectApply, resubmitApply, getApplyDetail} from "@/api/project-manage";
|
||||
import {useProcessStore} from '@/stores/processStore.js';
|
||||
import {downloadFile} from "@/api/project-demand";
|
||||
|
||||
const tagsViewStore = useTagsView()
|
||||
const router = useRouter()
|
||||
@@ -71,25 +72,31 @@ const tableConfig = reactive({
|
||||
align: 'center',
|
||||
currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
|
||||
},
|
||||
// {
|
||||
// prop: 'oper',
|
||||
// label: '操作',
|
||||
// align: 'center',
|
||||
// currentRender: ({row, index}) => {
|
||||
// return (
|
||||
// <div>
|
||||
// <a style="cursor: pointer;font-size: 14px;color: #2a99ff;" href={row.url}>下载</a>
|
||||
// <el-button type="primary" size="large" link onClick={() => beforeRemove(row)}>删除</el-button>
|
||||
// </div>
|
||||
// )
|
||||
// }
|
||||
// }
|
||||
{
|
||||
prop: 'oper',
|
||||
label: '操作',
|
||||
align: 'center',
|
||||
currentRender: ({row, index}) => {
|
||||
return (
|
||||
<el-button type="primary" link onClick={() => handleDownload(row)}>下载</el-button>
|
||||
)
|
||||
}
|
||||
}
|
||||
]
|
||||
})
|
||||
const loading = ref(false)
|
||||
const processInstanceData = ref()
|
||||
const processDiagramViewer = ref(true)
|
||||
const name = ref(router.currentRoute.value.name)
|
||||
const handleDownload = (row) => {
|
||||
downloadFile(row.fileId).then(res => {
|
||||
const blob = new Blob([res])
|
||||
let a = document.createElement('a')
|
||||
a.href = URL.createObjectURL(blob)
|
||||
a.download = row.originalFileName
|
||||
a.click()
|
||||
})
|
||||
}
|
||||
const compositeParam = (item) => {
|
||||
let tag = ''
|
||||
if (name.value === 'Initiation/apply' || name.value === 'Initiation/edit') {
|
||||
@@ -101,6 +108,7 @@ const compositeParam = (item) => {
|
||||
originalFileName: item.originalFilename,
|
||||
fileType: item.fileType,
|
||||
url: item.url,
|
||||
newFile: true,
|
||||
tag: tag
|
||||
}
|
||||
}
|
||||
@@ -126,17 +134,6 @@ const getFileParam = (item) => {
|
||||
const handleSubmit = (instance) => {
|
||||
if (!instance) return
|
||||
instance.validate(async (valid) => {
|
||||
if (JSON.stringify(file.value) === "{}") {
|
||||
attachment.value.validate()
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: '请上传附件',
|
||||
type: 'error'
|
||||
})
|
||||
return;
|
||||
} else {
|
||||
attachment.value.clearValidate()
|
||||
}
|
||||
if (!valid) return
|
||||
let files = []
|
||||
let singleFile = {}
|
||||
@@ -156,7 +153,7 @@ const handleSubmit = (instance) => {
|
||||
type: 'error'
|
||||
})
|
||||
return;
|
||||
}else {
|
||||
} else {
|
||||
attachment.value.clearValidate()
|
||||
}
|
||||
let params = {
|
||||
@@ -186,12 +183,6 @@ const handleResubmit = async () => {
|
||||
let files = []
|
||||
let singleFile = {}
|
||||
let fileArray
|
||||
// if (JSON.stringify(file.value) === "{}" || attachment.value.singleFile === null) {
|
||||
// attachment.value.validate()
|
||||
// return;
|
||||
// } else {
|
||||
// attachment.value.clearValidate()
|
||||
// }
|
||||
if (attachment.value.singleFile !== null && name.value === 'Initiation/edit') {
|
||||
singleFile = {
|
||||
fileId: attachment.value.singleFile.fileId
|
||||
@@ -223,7 +214,7 @@ const handleResubmit = async () => {
|
||||
type: 'error'
|
||||
})
|
||||
return;
|
||||
}else {
|
||||
} else {
|
||||
attachment.value.clearValidate()
|
||||
}
|
||||
console.log('params', params)
|
||||
@@ -269,7 +260,7 @@ const init = () => {
|
||||
nextTick(() => {
|
||||
processDiagramViewer.value = true
|
||||
})
|
||||
}else {
|
||||
} else {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
|
||||
@@ -8,12 +8,14 @@
|
||||
v-show="showActive == '00'"
|
||||
:loading="loading"
|
||||
/>
|
||||
<summary-detail v-show="showActive == '10'" :formData="commonForm.formData" :data="commonForm" :processViewer="commonProvessViewer" :loading="loading"/>
|
||||
<ApprovalDetail v-show="showActive == '20'" :formData="commonForm.formData" :data="commonForm" :processViewer="commonProvessViewer" :loading="loading"></ApprovalDetail>
|
||||
<summary-detail v-show="showActive == '10'" :formData="commonForm.formData" :data="commonForm"
|
||||
:processViewer="commonProvessViewer" :loading="loading" :fileListShow="fileListShow"/>
|
||||
<ApprovalDetail v-show="showActive == '20'" :formData="commonForm.formData" :data="commonForm"
|
||||
:processViewer="commonProvessViewer" :loading="loading" :fileListShow="fileListShow"/>
|
||||
<ApprovalDetail type="execute" v-show="showActive == '40'" :formData="commonForm.formData" :data="commonForm"
|
||||
:processViewer="commonProvessViewer" :loading="loading"></ApprovalDetail>
|
||||
:processViewer="commonProvessViewer" :loading="loading" :fileListShow="fileListShow"/>
|
||||
<ApprovalDetail type="archivist" v-show="showActive == '50'" :formData="commonForm.formData" :data="commonForm"
|
||||
:processViewer="commonProvessViewer" :loading="loading"></ApprovalDetail>
|
||||
:processViewer="commonProvessViewer" :loading="loading" :fileListShow="fileListShow"/>
|
||||
|
||||
</template>
|
||||
</steps>
|
||||
@@ -31,6 +33,7 @@ import Opinion from "@/components/DetailComponent/Opinion.vue";
|
||||
|
||||
const route = useRoute()
|
||||
const activeName = ref('first')
|
||||
const fileListShow = ref('READ')
|
||||
const loading = ref(false)
|
||||
const active = ref(route.query.state)
|
||||
const processStore = useProcessStore()
|
||||
@@ -63,6 +66,9 @@ const getAllInfo = async (state) => {
|
||||
processStore.passList.value = data.passList;
|
||||
nextTick(() => {
|
||||
commonProvessViewer.value = true
|
||||
if (data.formPermMap["fileList"]) {
|
||||
fileListShow.value = data.formPermMap["fileList"].perm
|
||||
}
|
||||
})
|
||||
loading.close()
|
||||
} catch {
|
||||
|
||||
@@ -155,7 +155,7 @@ const tableConfig = reactive({
|
||||
align: 'center',
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => {
|
||||
if (row.state !== null) {
|
||||
if (row.projectType !== null) {
|
||||
return (<Tag dictType={'project_type'} value={row.projectType}/>)
|
||||
} else {
|
||||
return '--'
|
||||
@@ -168,7 +168,7 @@ const tableConfig = reactive({
|
||||
align: 'center',
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => {
|
||||
if (row.state !== null) {
|
||||
if (row.rdSubject !== null) {
|
||||
return (<Tag dictType={'rd_subject'} value={row.rdSubject}/>)
|
||||
} else {
|
||||
return '--'
|
||||
@@ -181,7 +181,7 @@ const tableConfig = reactive({
|
||||
align: 'center',
|
||||
showOverflowTooltip: false,
|
||||
currentRender: ({row, index}) => {
|
||||
if (row.state !== null) {
|
||||
if (row.projectImpact !== null) {
|
||||
return (<Tag dictType={'project_impact'} value={row.projectImpact}/>)
|
||||
} else {
|
||||
return '--'
|
||||
@@ -190,7 +190,7 @@ const tableConfig = reactive({
|
||||
},
|
||||
{
|
||||
prop: 'economicEstimate',
|
||||
label: '经济概算(万元)',
|
||||
label: '经济概算(元)',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<baseTitle title="上传附件"></baseTitle>
|
||||
<el-card style="width: 100%;margin: 15px 0">
|
||||
<file-upload @getFile="getFile"/>
|
||||
<fvTable style="width: 100%;max-height: 250px;height: 250px" v-if="showTable" :tableConfig="tableConfig"
|
||||
<fvTable style="width: 100%;max-height: 300px;" v-if="showTable" :tableConfig="tableConfig"
|
||||
:data="fileList" :isSettingCol="false" :pagination="false">
|
||||
<template #empty>
|
||||
<el-empty :image-size="90" description="暂无数据" style="padding: 0"/>
|
||||
@@ -127,5 +127,7 @@ const handleSubmit = async () => {
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
:deep(.el-table--fit ){
|
||||
height: 300px!important;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
<el-form-item label="专项资金名称" prop="name">
|
||||
<el-input v-model="formData.name" placeholder="请输入专项资金名称" clearable></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="金额(万元)" prop="fundAmount">
|
||||
<el-input v-model="formData.fundAmount" placeholder="请输入金额" clearable></el-input>
|
||||
<el-form-item label="金额(元)" prop="fundAmount">
|
||||
<el-input-number v-model="formData.fundAmount" placeholder="请输入金额" :controls="false"/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<baseTitle title="介绍"></baseTitle>
|
||||
@@ -14,7 +14,7 @@
|
||||
v-model:value="formData.introduce"/>
|
||||
<baseTitle title="申请文件"></baseTitle>
|
||||
<file-upload @getFile="getFile"/>
|
||||
<fvTable style="width: 100%;max-height: 650px;" v-if="showTable"
|
||||
<fvTable style="width: 100%;max-height: 300px;" v-if="showTable"
|
||||
:tableConfig="tableConfig" :data="formData.files"
|
||||
:isSettingCol="false" :pagination="false">
|
||||
<template #empty>
|
||||
@@ -115,6 +115,7 @@ const compositeParam = (item) => {
|
||||
originalFileName: item.originalFilename,
|
||||
fileType: item.fileType,
|
||||
url: item.url,
|
||||
newFile: true,
|
||||
tag: tag
|
||||
}
|
||||
}
|
||||
@@ -169,7 +170,7 @@ const handleSubmit = async (instance) => {
|
||||
const handleResubmit = () => {
|
||||
if (!route.query.id) return
|
||||
let params = {
|
||||
id: route.query.id,
|
||||
specialFundId: route.query.id,
|
||||
...submitParam(formData.value)
|
||||
}
|
||||
resubmitFund(params).then(res => {
|
||||
@@ -189,11 +190,6 @@ const handleResubmit = () => {
|
||||
const init = async () => {
|
||||
processDiagramViewer.value = false
|
||||
getFundProcess().then(res => {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
if (res.code === 1000) {
|
||||
let data = res.data
|
||||
processInstanceData.value = data
|
||||
@@ -206,6 +202,12 @@ const init = async () => {
|
||||
nextTick(() => {
|
||||
processDiagramViewer.value = true
|
||||
})
|
||||
}else {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: msg,
|
||||
type:'error'
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -237,6 +239,8 @@ onMounted(async () => {
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
<style scoped lang="scss">
|
||||
:deep(.el-table--fit ){
|
||||
height: 300px!important;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
|
||||
<script setup lang="jsx">
|
||||
import fvSelect from '@/fvcomponents/fvSelect/index.vue'
|
||||
import { ElNotification} from "element-plus";
|
||||
import {deleteFund} from "@/api/special-fund";
|
||||
|
||||
const router = useRouter()
|
||||
const searchConfig = reactive([
|
||||
@@ -33,7 +35,7 @@ const searchConfig = reactive([
|
||||
}
|
||||
},
|
||||
{
|
||||
label: '资金金额(万元)',
|
||||
label: '资金金额(元)',
|
||||
prop: 'fundAmount',
|
||||
component: 'el-input',
|
||||
props: {
|
||||
@@ -41,7 +43,7 @@ const searchConfig = reactive([
|
||||
placeholder: '请输入资金金额查询'
|
||||
}
|
||||
}, {
|
||||
label: '剩余金额(万元)',
|
||||
label: '剩余金额(元)',
|
||||
prop: 'residualAmount',
|
||||
component: 'el-input',
|
||||
props: {
|
||||
@@ -72,12 +74,12 @@ const tableConfig = reactive({
|
||||
},
|
||||
{
|
||||
prop: 'fundAmount',
|
||||
label: '资金金额(万元)',
|
||||
label: '资金金额(元)',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
prop: 'residualAmount',
|
||||
label: '剩余金额(万元)',
|
||||
label: '剩余金额(元)',
|
||||
align: 'center'
|
||||
},
|
||||
{
|
||||
@@ -117,9 +119,6 @@ const tableConfig = reactive({
|
||||
if (buttons.has("edit")) {
|
||||
btn.push({label: '编辑', prem: ['mosr:collect:resubmit'], func: () => handleEdit(row), type: 'primary'})
|
||||
}
|
||||
// if (buttons.has("delete")) {
|
||||
// btn.push({label: '删除',prem: ['mosr:requirement:del'], func: () => handleDelete(row), type: 'primary'})
|
||||
// }
|
||||
return (
|
||||
<div style={{width: '100%'}}>
|
||||
{
|
||||
@@ -162,7 +161,7 @@ const handleDetail = (row) => {
|
||||
router.push({
|
||||
name: 'Fund/detail',
|
||||
query: {
|
||||
id: row.id
|
||||
id: row.specialFundId
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -176,7 +175,19 @@ const handleEdit = (row) => {
|
||||
router.push({
|
||||
name: 'Fund/edit',
|
||||
query: {
|
||||
id: row.id
|
||||
id: row.specialFundId
|
||||
}
|
||||
})
|
||||
}
|
||||
const handleDelete = async (row) => {
|
||||
deleteFund(row.specialFundId).then(res => {
|
||||
ElNotification({
|
||||
title: '提示',
|
||||
message: res.msg,
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
if (res.code === 1000) {
|
||||
tableIns.value.refresh()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@@ -324,6 +324,7 @@ const doPublish = () => {
|
||||
type: res.code === 1000 ? 'success' : 'error'
|
||||
})
|
||||
if (res.code === 1000) {
|
||||
validVisible.value = false
|
||||
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
|
||||
router.push("/workflow/process")
|
||||
}
|
||||
|
||||
@@ -142,14 +142,15 @@ const selectDefinition = ref(null)
|
||||
const historyVersionList = ref([])
|
||||
const singleTable = ref()
|
||||
const isVisited = ref(false)
|
||||
|
||||
onActivated(()=>{
|
||||
getList()
|
||||
})
|
||||
//重置搜索
|
||||
const handleReset = () => {
|
||||
queryForm.value.resetFields()
|
||||
getList()
|
||||
}
|
||||
|
||||
|
||||
//获取数据
|
||||
const getList = async () => {
|
||||
let params = {
|
||||
|
||||