形象进度开发
parent
9886d8c731
commit
fdafdcd16e
|
@ -17,7 +17,16 @@ const findAllSchedule = (data) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//查询计划进度
|
||||||
|
const findPlanProgress=projectId=>{
|
||||||
|
return request({
|
||||||
|
url: `/manage/plan/findPlanProgress/${projectId}`,
|
||||||
|
method: "get",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
findAllPlanDatas,
|
findAllPlanDatas,
|
||||||
findAllSchedule
|
findAllSchedule,
|
||||||
|
findPlanProgress
|
||||||
};
|
};
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
<svg class="icon" style="width: 1em;height: 1em;vertical-align: middle;fill: currentColor;overflow: hidden;" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9075"><path d="M960 938.666667h-21.333333v-89.753334c9.846667-4.206667 18.793333-11.293333 25.906666-20.773333 10.806667-14.413333 16.76-33.246667 16.76-53.026667 0-19-5.546667-49.873333-13.48-75.08-4.746667-15.06-10.06-27.373333-15.793333-36.6-9.666667-15.546667-21.333333-23.433333-34.726667-23.433333s-25.06 7.886667-34.726666 23.433333c-5.733333 9.226667-11.046667 21.54-15.793334 36.6-7.933333 25.206667-13.48 56.08-13.48 75.08 0 19.78 5.953333 38.613333 16.76 53.026667 7.113333 9.48 16.06 16.566667 25.906667 20.773333V938.666667h-85.333333v-170.666667c0-47.12 12.04-91.133333 33.906666-123.933333C864.666667 613.933333 890.506667 597.333333 917.333333 597.333333a21.333333 21.333333 0 0 0 21.333334-21.333333V277.333333a21.333333 21.333333 0 0 0-21.333334-21.333333h-21.333333v-64a21.333333 21.333333 0 0 0-21.333333-21.333333H576a21.333333 21.333333 0 0 0-21.333333 21.333333v64h-44.813334a106.98 106.98 0 0 0-84.98-83.54A106.98 106.98 0 0 0 341.333333 87.48V64a21.333333 21.333333 0 0 0-42.666666 0v23.48a106.98 106.98 0 0 0-83.54 84.98C165.613333 181.666667 128 225.193333 128 277.333333v106.666667h-21.333333a21.333333 21.333333 0 0 0-21.333334 21.333333v64H64a21.333333 21.333333 0 0 0-21.333333 21.333334v469.333333a21.333333 21.333333 0 0 0 21.333333 21.333333h896a21.333333 21.333333 0 0 0 0-42.666666zM213.333333 810.666667h-42.666666v-85.333334h42.666666z m0-128h-42.666666V597.333333h42.666666z m170.666667 256h-42.666667V469.333333h-42.666666V384h42.666666v85.333333h42.666667z m384-554.666667h42.666667v85.333333h-42.666667z m-128 469.333333h-42.666667v-85.333333h42.666667z m0-128h-42.666667V640h42.666667z m0-128h-42.666667V512h42.666667z m0-128h-42.666667V384h42.666667z m85.333333 384h-42.666666v-85.333333h42.666666z m0-128h-42.666666V640h42.666666z m0-128h-42.666666V512h42.666666z m0-128h-42.666666V384h42.666666z m42.666667 42.666667h42.666667v85.333333h-42.666667z" p-id="9076"></path></svg>
|
<svg class="icon" style="width: 1em;height: 1em;vertical-align: middle;fill: currentColor;overflow: hidden;" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5081"><path d="M811.033 70c41.238 0 74.667 33.43 74.667 74.667V869.67a75.3 75.3 0 0 1-0.756 10.667H939c17.673 0 32 14.327 32 32 0 17.496-14.042 31.713-31.47 31.995l-0.53 0.005H86c-17.673 0-32-14.327-32-32 0-17.497 14.042-31.713 31.47-31.996l0.53-0.004h54.056a75.3 75.3 0 0 1-0.756-10.667V613.81c0-41.238 33.43-74.667 74.667-74.667h85.266a75.3 75.3 0 0 1 10.667 0.756V144.667C309.9 103.429 343.33 70 384.567 70z m-511.8 533.143h-85.266c-5.891 0-10.667 4.775-10.667 10.667V869.67c0 5.891 4.776 10.667 10.667 10.667h85.266c5.891 0 10.667-4.776 10.667-10.667V743.009c-0.659 16.91-14.44 30.451-31.446 30.727l-0.529 0.004H256.6c-17.673 0-32-14.327-32-32 0-17.496 14.042-31.713 31.47-31.995l0.53-0.005h21.325c17.252 0 31.316 13.653 31.976 30.743L309.9 613.81c0-5.892-4.776-10.667-10.667-10.667zM811.033 134H384.567c-5.891 0-10.667 4.776-10.667 10.667V869.67c0 5.891 4.776 10.667 10.667 10.667h426.466c5.891 0 10.667-4.776 10.667-10.667V144.667c0-5.891-4.776-10.667-10.667-10.667zM725.75 677.766v85.299h-85.3v-85.299h85.3z m0-149.272v85.298h-85.3v-85.298h85.3zM555.15 379.22v85.298h-85.3v-85.298h85.3z m170.6 0v85.298h-85.3v-85.298h85.3z m-170.6-149.273v85.299h-85.3v-85.299h85.3z m170.6 0v85.299h-85.3v-85.299h85.3z" p-id="5082"></path></svg>
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 1.4 KiB |
|
@ -190,6 +190,17 @@
|
||||||
<img :src="rightSrc" class="toSafety-fixed-right-img" @click="arrowRetract" id="arrowRight" />
|
<img :src="rightSrc" class="toSafety-fixed-right-img" @click="arrowRetract" id="arrowRight" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="div-mode">
|
||||||
|
<div class="mode-item" :class="{ 'is-active': mode == 'plan' }" @click="changeMode('plan')">
|
||||||
|
<svg-icon icon-class="funnel" />
|
||||||
|
<span>形象进度</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mode-item" :class="{ 'is-active': mode == 'model' }" @click="changeMode('model')">
|
||||||
|
<svg-icon icon-class="city" />
|
||||||
|
<span>整体模型</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="div-tools" :class="'menu-' + menuShowCount">
|
<div class="div-tools" :class="'menu-' + menuShowCount">
|
||||||
<div class="tool-item" @click="resetScene">
|
<div class="tool-item" @click="resetScene">
|
||||||
<div class="icon">
|
<div class="icon">
|
||||||
|
@ -223,6 +234,25 @@
|
||||||
<span class="sp-text">电箱监控</span>
|
<span class="sp-text">电箱监控</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="plan-chart" :class="{ isShow: leftShow, isHide: !leftShow }" v-if="mode=='plan'">
|
||||||
|
<div class="plan-item">
|
||||||
|
<span style="background:rgba(59, 255, 0,1)"></span>
|
||||||
|
<span>提前完工</span>
|
||||||
|
</div>
|
||||||
|
<div class="plan-item">
|
||||||
|
<span style="background:rgba(255,255,255,1)"></span>
|
||||||
|
<span>正常完工</span>
|
||||||
|
</div>
|
||||||
|
<div class="plan-item">
|
||||||
|
<span style="background:rgba(250, 0, 0,1)"></span>
|
||||||
|
<span>延迟完工</span>
|
||||||
|
</div>
|
||||||
|
<div class="plan-item">
|
||||||
|
<span style="background:rgba(0,0, 255,1)"></span>
|
||||||
|
<span>正在施工</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
<video-dialog ref="videoDlg"></video-dialog>
|
<video-dialog ref="videoDlg"></video-dialog>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -346,6 +376,9 @@ export default {
|
||||||
power: false, //电箱监控
|
power: false, //电箱监控
|
||||||
},
|
},
|
||||||
menuShowCount: 0,
|
menuShowCount: 0,
|
||||||
|
isClient: false,
|
||||||
|
modelLoadSuccess: false, //模型加载成功
|
||||||
|
mode: "model", //显示模式 model-整体模型 plan-形象进度
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
|
@ -722,7 +755,8 @@ export default {
|
||||||
this.elId++;
|
this.elId++;
|
||||||
this.activeMenu = 0;
|
this.activeMenu = 0;
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
if (localStorage.getItem("BimClient")) {
|
this.isClient = localStorage.getItem("BimClient");
|
||||||
|
if (this.isClient) {
|
||||||
this.loadEngine2();
|
this.loadEngine2();
|
||||||
} else {
|
} else {
|
||||||
this.loadEngine();
|
this.loadEngine();
|
||||||
|
@ -827,7 +861,13 @@ export default {
|
||||||
projectId: this.selProject.id,
|
projectId: this.selProject.id,
|
||||||
})
|
})
|
||||||
.then((d) => {
|
.then((d) => {
|
||||||
this.models = d.rows || [];
|
this.models = (d.rows || []).map((it) => {
|
||||||
|
it.modelId = it.lightweightName;
|
||||||
|
it.visible = false;
|
||||||
|
it.checked = true;
|
||||||
|
it.gis = this.$tryToJson(it.gisJson || "{}", {});
|
||||||
|
return it;
|
||||||
|
});
|
||||||
if (this.models.length == 0) {
|
if (this.models.length == 0) {
|
||||||
this.$message.error("暂无模型,请先关联模型");
|
this.$message.error("暂无模型,请先关联模型");
|
||||||
} else {
|
} else {
|
||||||
|
@ -839,6 +879,9 @@ export default {
|
||||||
},
|
},
|
||||||
addModel(modelId, cb) {
|
addModel(modelId, cb) {
|
||||||
let url = `${window.config.modelUrl}/Tools/output/model/${modelId}/root.glt`;
|
let url = `${window.config.modelUrl}/Tools/output/model/${modelId}/root.glt`;
|
||||||
|
if (this.isClient) {
|
||||||
|
url = `/bimdata/Tools/output/model/${modelId}/root.glt`;
|
||||||
|
}
|
||||||
let api = bimMgrApi;
|
let api = bimMgrApi;
|
||||||
console.log(modelId, url);
|
console.log(modelId, url);
|
||||||
api.Model.add(
|
api.Model.add(
|
||||||
|
@ -850,17 +893,85 @@ export default {
|
||||||
console.log("加载模型成功");
|
console.log("加载模型成功");
|
||||||
this.loadDevicePosition();
|
this.loadDevicePosition();
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
if (this.viewPoint) {
|
if (this.isClient) {
|
||||||
api.Camera.setViewPort(this.viewPoint);
|
|
||||||
} else {
|
} else {
|
||||||
api.Camera.getViewPort((p) => {
|
if (this.viewPoint) {
|
||||||
this.viewPoint = p;
|
api.Camera.setViewPort(this.viewPoint);
|
||||||
});
|
} else {
|
||||||
|
api.Camera.getViewPort((p) => {
|
||||||
|
this.viewPoint = p;
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
this.modelLoadSuccess = true;
|
||||||
}, 1000);
|
}, 1000);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
changeMode(mode) {
|
||||||
|
if (!this.modelLoadSuccess) {
|
||||||
|
this.$message.error("模型加载中,请稍后");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (mode == this.mode) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.mode = mode;
|
||||||
|
let api = bimMgrApi;
|
||||||
|
if (mode == "model") {
|
||||||
|
this.models.forEach((it) => {
|
||||||
|
api.Model.original(it.lightweightName);
|
||||||
|
api.Model.setAlpha(it.lightweightName,1);
|
||||||
|
});
|
||||||
|
this.resetScene();
|
||||||
|
} else {
|
||||||
|
this.$api.planSchedule.findPlanProgress(this.selProject.id).then((d) => {
|
||||||
|
let datas = d.data || [];
|
||||||
|
let beforeData = []; //提前完工
|
||||||
|
let afterData = []; //延迟完工
|
||||||
|
let processData = []; //进行中
|
||||||
|
let standData = []; //正常完工
|
||||||
|
let allData = [];
|
||||||
|
datas.forEach((it) => {
|
||||||
|
let planFinishDate = it.planFinishDate;
|
||||||
|
let finishDate = it.finishDate;
|
||||||
|
it.bim = this.$tryToJson(it.bimId, []);
|
||||||
|
if (finishDate == "2000-01-01") {
|
||||||
|
it.bim.forEach((item) => {
|
||||||
|
processData.push(item);
|
||||||
|
allData.push(item);
|
||||||
|
});
|
||||||
|
} else if (planFinishDate == finishDate) {
|
||||||
|
it.bim.forEach((item) => {
|
||||||
|
standData.push(item);
|
||||||
|
allData.push(item);
|
||||||
|
});
|
||||||
|
} else if (this.$dt(planFinishDate) < this.$dt(finishDate)) {
|
||||||
|
it.bim.forEach((item) => {
|
||||||
|
afterData.push(item);
|
||||||
|
allData.push(item);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
it.bim.forEach((item) => {
|
||||||
|
beforeData.push(item);
|
||||||
|
allData.push(item);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//console.log("====>",beforeData,afterData,processData,standData);
|
||||||
|
if (allData.length > 0) {
|
||||||
|
allData=allData.map(item=>item.featureId);
|
||||||
|
this.models.forEach(model=>{
|
||||||
|
api.Model.setAlpha(model.lightweightName,0.5);
|
||||||
|
});
|
||||||
|
api.Feature.setColor(beforeData.map((it) => it.featureId).join("#"), "rgba(59, 255, 0,1)");
|
||||||
|
api.Feature.setColor(standData.map((it) => it.featureId).join("#"), "rgba(255,255,255,1)");
|
||||||
|
api.Feature.setColor(processData.map((it) => it.featureId).join("#"), "rgba(0,0, 255,1)");
|
||||||
|
api.Feature.setColor(afterData.map((it) => it.featureId).join("#"), "rgba(250, 0, 0,1)");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
resetScene() {
|
resetScene() {
|
||||||
bimMgrApi.Camera.stopImmersiveRoam();
|
bimMgrApi.Camera.stopImmersiveRoam();
|
||||||
bimMgrApi.Model.location(bimMgrApi.m_model.keys().toArray()[0]);
|
bimMgrApi.Model.location(bimMgrApi.m_model.keys().toArray()[0]);
|
||||||
|
@ -1087,6 +1198,61 @@ export default {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.div-mode {
|
||||||
|
position: absolute;
|
||||||
|
top: calc(80vh - 110px);
|
||||||
|
left: 50%;
|
||||||
|
display: flex;
|
||||||
|
padding: 10px 0px;
|
||||||
|
background: #00000080;
|
||||||
|
border-radius: 10px;
|
||||||
|
margin-left: -125px;
|
||||||
|
.mode-item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 30px;
|
||||||
|
margin: 0px 10px;
|
||||||
|
background: #05798754;
|
||||||
|
padding: 0px 10px;
|
||||||
|
border-radius: 13px;
|
||||||
|
cursor: pointer;
|
||||||
|
&.is-active {
|
||||||
|
background: #097fca94;
|
||||||
|
color: #75fbfd;
|
||||||
|
border: solid 1px #75fbfd;
|
||||||
|
.svg-icon {
|
||||||
|
fill: #75fbfd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.svg-icon {
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
margin-right: 4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.plan-chart{
|
||||||
|
position: absolute;
|
||||||
|
top: calc(80vh - 110px);
|
||||||
|
right: 40px;
|
||||||
|
&.isShow{
|
||||||
|
right:calc(20% + 140px);
|
||||||
|
}
|
||||||
|
.plan-item{
|
||||||
|
display: flex;
|
||||||
|
font-size:12px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
span{
|
||||||
|
display:block;
|
||||||
|
&:first-child{
|
||||||
|
width:15px;
|
||||||
|
height:15px;
|
||||||
|
margin-right:4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
.div-tools {
|
.div-tools {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: calc(80vh - 50px);
|
top: calc(80vh - 50px);
|
||||||
|
|
|
@ -46,6 +46,13 @@ module.exports = defineConfig({
|
||||||
"^/cesium": "/",
|
"^/cesium": "/",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"/bimdata": {
|
||||||
|
target: `http://62.234.3.186/bimdata/`,
|
||||||
|
changeOrigin: true,
|
||||||
|
pathRewrite: {
|
||||||
|
"^/bimdata": "/",
|
||||||
|
},
|
||||||
|
},
|
||||||
"/cdn": {
|
"/cdn": {
|
||||||
target: `http://62.234.3.186/cdn/`,
|
target: `http://62.234.3.186/cdn/`,
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
|
|
|
@ -135,4 +135,9 @@ public interface ProPlanMapper
|
||||||
* 查询计划任务数据
|
* 查询计划任务数据
|
||||||
*/
|
*/
|
||||||
public List<ProPlan> findAllPlanDatasByProId(Long proId);
|
public List<ProPlan> findAllPlanDatasByProId(Long proId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询计划进度
|
||||||
|
*/
|
||||||
|
public List<ProPlan> findPlanProgress(Long proId);
|
||||||
}
|
}
|
||||||
|
|
|
@ -303,6 +303,27 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
</where>
|
</where>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<select id="findPlanProgress" parameterType="Long" resultMap="ProPlanResult">
|
||||||
|
SELECT
|
||||||
|
pp.id,pp.comid,pp.project_id,pp.task_id,pp.task_unique_id,pp.parent_id,pp.task_type,pp.task_outline_level,pp.task_name,pp.task_duation,pp.start_date,pp.predecessors,pp.plan_start_date,pp.plan_finish_date,
|
||||||
|
pp.bim_id,pp.operator,pp.operator_id,pp.group_id,pp.group_name,pp.schedule_node,pp.is_del,pp.create_by,pp.create_time,pp.update_by,pp.update_time,
|
||||||
|
pps.finish_date AS finish_date
|
||||||
|
FROM
|
||||||
|
pro_plan pp
|
||||||
|
JOIN (
|
||||||
|
SELECT
|
||||||
|
plan_id,
|
||||||
|
ifnull(max(date(finish_date)),'2000-01-01') AS finish_date
|
||||||
|
FROM
|
||||||
|
pro_plan_schedule
|
||||||
|
WHERE
|
||||||
|
project_id = #{proId}
|
||||||
|
GROUP BY
|
||||||
|
plan_id
|
||||||
|
) pps ON pp.id = pps.plan_id
|
||||||
|
WHERE
|
||||||
|
pp.project_id = #{proId}
|
||||||
|
</select>
|
||||||
<select id="findAllPlanDatasByProId" parameterType="Long" resultMap="ProPlanResult">
|
<select id="findAllPlanDatasByProId" parameterType="Long" resultMap="ProPlanResult">
|
||||||
SELECT
|
SELECT
|
||||||
pp.id,
|
pp.id,
|
||||||
|
|
|
@ -252,4 +252,14 @@ public class ProPlanController extends BaseController
|
||||||
List<ProPlan> plans = proPlanService.findAllPlanDatasByProId(proId);
|
List<ProPlan> plans = proPlanService.findAllPlanDatasByProId(proId);
|
||||||
return success(plans);
|
return success(plans);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询计划进度
|
||||||
|
*/
|
||||||
|
@GetMapping(value = "/findPlanProgress/{proId}")
|
||||||
|
public AjaxResult findPlanProgress(@PathVariable("proId") Long proId){
|
||||||
|
List<ProPlan> plans = proPlanService.findPlanProgress(proId);
|
||||||
|
return success(plans);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,4 +97,9 @@ public interface IProPlanService
|
||||||
* 查询计划任务数据
|
* 查询计划任务数据
|
||||||
*/
|
*/
|
||||||
public List<ProPlan> findAllPlanDatasByProId(Long proId);
|
public List<ProPlan> findAllPlanDatasByProId(Long proId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询计划进度
|
||||||
|
*/
|
||||||
|
public List<ProPlan> findPlanProgress(Long proId);
|
||||||
}
|
}
|
||||||
|
|
|
@ -218,4 +218,12 @@ public class ProPlanServiceImpl implements IProPlanService
|
||||||
public List<ProPlan> findAllPlanDatasByProId(Long proId){
|
public List<ProPlan> findAllPlanDatasByProId(Long proId){
|
||||||
return proPlanMapper.findAllPlanDatasByProId(proId);
|
return proPlanMapper.findAllPlanDatasByProId(proId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询计划进度
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<ProPlan> findPlanProgress(Long proId) {
|
||||||
|
return proPlanMapper.findPlanProgress(proId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,27 +1,11 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-form
|
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
|
||||||
:model="queryParams"
|
|
||||||
ref="queryRef"
|
|
||||||
:inline="true"
|
|
||||||
v-show="showSearch"
|
|
||||||
label-width="68px"
|
|
||||||
>
|
|
||||||
<el-form-item label="项目名称" prop="projectName" v-if="!userStore.currentPrjId">
|
<el-form-item label="项目名称" prop="projectName" v-if="!userStore.currentPrjId">
|
||||||
<el-input
|
<el-input v-model="queryParams.projectName" placeholder="请输入项目名称" clearable @keyup.enter="handleQuery" />
|
||||||
v-model="queryParams.projectName"
|
|
||||||
placeholder="请输入项目名称"
|
|
||||||
clearable
|
|
||||||
@keyup.enter="handleQuery"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="计划名称" prop="taskName">
|
<el-form-item label="计划名称" prop="taskName">
|
||||||
<el-input
|
<el-input v-model="queryParams.taskName" placeholder="请输入计划名称" clearable @keyup.enter="handleQuery" />
|
||||||
v-model="queryParams.taskName"
|
|
||||||
placeholder="请输入计划名称"
|
|
||||||
clearable
|
|
||||||
@keyup.enter="handleQuery"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
|
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
|
||||||
|
@ -31,29 +15,12 @@
|
||||||
|
|
||||||
<el-row :gutter="10" class="mb8">
|
<el-row :gutter="10" class="mb8">
|
||||||
<el-col :span="1.5">
|
<el-col :span="1.5">
|
||||||
<el-button
|
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['manage:schedule:add']">新增</el-button>
|
||||||
type="primary"
|
|
||||||
plain
|
|
||||||
icon="Plus"
|
|
||||||
@click="handleAdd"
|
|
||||||
v-hasPermi="['manage:schedule:add']"
|
|
||||||
>新增</el-button
|
|
||||||
>
|
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="1.5">
|
<el-col :span="1.5">
|
||||||
<el-button
|
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['manage:schedule:export']">导出</el-button>
|
||||||
type="warning"
|
|
||||||
plain
|
|
||||||
icon="Download"
|
|
||||||
@click="handleExport"
|
|
||||||
v-hasPermi="['manage:schedule:export']"
|
|
||||||
>导出</el-button
|
|
||||||
>
|
|
||||||
</el-col>
|
</el-col>
|
||||||
<right-toolbar
|
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
|
||||||
v-model:showSearch="showSearch"
|
|
||||||
@queryTable="getList"
|
|
||||||
></right-toolbar>
|
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
<el-table v-loading="loading" :data="scheduleList">
|
<el-table v-loading="loading" :data="scheduleList">
|
||||||
|
@ -65,22 +32,12 @@
|
||||||
<el-tag effect="plain">{{ scope.row.taskDuation + " 天" }}</el-tag>
|
<el-tag effect="plain">{{ scope.row.taskDuation + " 天" }}</el-tag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column label="计划开始时间" align="center" prop="planStartDate" width="120">
|
||||||
label="计划开始时间"
|
|
||||||
align="center"
|
|
||||||
prop="planStartDate"
|
|
||||||
width="120"
|
|
||||||
>
|
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<span>{{ parseTime(scope.row.planStartDate, "{y}-{m}-{d}") }}</span>
|
<span>{{ parseTime(scope.row.planStartDate, "{y}-{m}-{d}") }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column label="计划结束时间" align="center" prop="planFinishDate" width="120">
|
||||||
label="计划结束时间"
|
|
||||||
align="center"
|
|
||||||
prop="planFinishDate"
|
|
||||||
width="120"
|
|
||||||
>
|
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<span>{{ parseTime(scope.row.planFinishDate, "{y}-{m}-{d}") }}</span>
|
<span>{{ parseTime(scope.row.planFinishDate, "{y}-{m}-{d}") }}</span>
|
||||||
</template>
|
</template>
|
||||||
|
@ -92,12 +49,8 @@
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="完成进度" align="center" prop="schedulePercent" width="88">
|
<el-table-column label="完成进度" align="center" prop="schedulePercent" width="88">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-tag v-if="scope.row.schedulePercent != 100" effect="dark" type="info">{{
|
<el-tag v-if="scope.row.schedulePercent != 100" effect="dark" type="info">{{ scope.row.schedulePercent + " %" }}</el-tag>
|
||||||
scope.row.schedulePercent + " %"
|
<el-tag v-else effect="dark" type="success">{{ scope.row.schedulePercent + " %" }}</el-tag>
|
||||||
}}</el-tag>
|
|
||||||
<el-tag v-else effect="dark" type="success">{{
|
|
||||||
scope.row.schedulePercent + " %"
|
|
||||||
}}</el-tag>
|
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="实际完成时间" align="center" prop="finishDate" width="120">
|
<el-table-column label="实际完成时间" align="center" prop="finishDate" width="120">
|
||||||
|
@ -108,63 +61,23 @@
|
||||||
<el-table-column label="施工作业图" align="center" prop="images" width="120">
|
<el-table-column label="施工作业图" align="center" prop="images" width="120">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<div v-if="scope.row.images != null">
|
<div v-if="scope.row.images != null">
|
||||||
<image-preview
|
<image-preview v-if="scope.row.images.split(',').length == 1" :src="scope.row.images" :width="50" :height="50" />
|
||||||
v-if="scope.row.images.split(',').length == 1"
|
<el-badge v-if="scope.row.images.split(',').length > 1" :value="scope.row.images.split(',').length" type="primary" class="item" :offset="[2, 8]">
|
||||||
:src="scope.row.images"
|
|
||||||
:width="50"
|
|
||||||
:height="50"
|
|
||||||
/>
|
|
||||||
<el-badge
|
|
||||||
v-if="scope.row.images.split(',').length > 1"
|
|
||||||
:value="scope.row.images.split(',').length"
|
|
||||||
type="primary"
|
|
||||||
class="item"
|
|
||||||
:offset="[2, 8]"
|
|
||||||
>
|
|
||||||
<image-preview :src="scope.row.images" :width="50" :height="50" />
|
<image-preview :src="scope.row.images" :width="50" :height="50" />
|
||||||
</el-badge>
|
</el-badge>
|
||||||
</div>
|
</div>
|
||||||
<div v-else style="color: var(--el-color-info-light-3)">暂无图片</div>
|
<div v-else style="color: var(--el-color-info-light-3)">暂无图片</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column v-if="false" label="操作" align="center" width="200" fixed="right" class-name="small-padding fixed-width">
|
||||||
v-if="false"
|
|
||||||
label="操作"
|
|
||||||
align="center"
|
|
||||||
width="200"
|
|
||||||
fixed="right"
|
|
||||||
class-name="small-padding fixed-width"
|
|
||||||
>
|
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button
|
<el-button v-if="scope.row.id == scope.row.maxId" link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['manage:schedule:edit']">修改</el-button>
|
||||||
v-if="scope.row.id == scope.row.maxId"
|
<el-button v-if="scope.row.id == scope.row.maxId" link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['manage:schedule:remove']">删除</el-button>
|
||||||
link
|
|
||||||
type="primary"
|
|
||||||
icon="Edit"
|
|
||||||
@click="handleUpdate(scope.row)"
|
|
||||||
v-hasPermi="['manage:schedule:edit']"
|
|
||||||
>修改</el-button
|
|
||||||
>
|
|
||||||
<el-button
|
|
||||||
v-if="scope.row.id == scope.row.maxId"
|
|
||||||
link
|
|
||||||
type="primary"
|
|
||||||
icon="Delete"
|
|
||||||
@click="handleDelete(scope.row)"
|
|
||||||
v-hasPermi="['manage:schedule:remove']"
|
|
||||||
>删除</el-button
|
|
||||||
>
|
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
|
|
||||||
<pagination
|
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
|
||||||
v-show="total > 0"
|
|
||||||
:total="total"
|
|
||||||
v-model:page="queryParams.pageNum"
|
|
||||||
v-model:limit="queryParams.pageSize"
|
|
||||||
@pagination="getList"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<!-- 添加或修改项目进度对话框 -->
|
<!-- 添加或修改项目进度对话框 -->
|
||||||
<el-dialog :title="title" v-model="open" width="798px" append-to-body>
|
<el-dialog :title="title" v-model="open" width="798px" append-to-body>
|
||||||
|
@ -176,44 +89,16 @@
|
||||||
<el-input v-model="form.taskName" placeholder="请输入工程计划名称" disabled />
|
<el-input v-model="form.taskName" placeholder="请输入工程计划名称" disabled />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="工程计划名称" prop="planId">
|
<el-form-item label="工程计划名称" prop="planId">
|
||||||
<el-tree-select
|
<el-tree-select ref="selTreePlan" v-model="form.planId" :data="planOptions" :props="{ value: 'id', label: 'taskName', children: 'children' }" value-key="id" placeholder="请选择工程计划名称" style="width: 100%" @change="(v) => handleChangePlan(v)">
|
||||||
ref="selTreePlan"
|
|
||||||
v-model="form.planId"
|
|
||||||
:data="planOptions"
|
|
||||||
:props="{ value: 'id', label: 'taskName', children: 'children' }"
|
|
||||||
value-key="id"
|
|
||||||
placeholder="请选择工程计划名称"
|
|
||||||
style="width: 100%"
|
|
||||||
@change="(v) => handleChangePlan(v)"
|
|
||||||
>
|
|
||||||
<template #default="{ node, data }">
|
<template #default="{ node, data }">
|
||||||
{{ data.taskName
|
{{ data.taskName }}<span style="float: right; color: var(--el-text-color-secondary); font-weight: 600">{{ data.scheduleNode }} % </span>
|
||||||
}}<span
|
|
||||||
style="
|
|
||||||
float: right;
|
|
||||||
color: var(--el-text-color-secondary);
|
|
||||||
font-weight: 600;
|
|
||||||
"
|
|
||||||
>{{ data.scheduleNode }} %
|
|
||||||
</span>
|
|
||||||
</template>
|
</template>
|
||||||
</el-tree-select>
|
</el-tree-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="当前完成进度" prop="schedulePercent">
|
<el-form-item label="当前完成进度" prop="schedulePercent">
|
||||||
<el-input-number
|
<el-input-number v-model="form.schedulePercent" placeholder="请输入当前完成进度" :min="previousSchedule.schedulePercent ? previousSchedule.schedulePercent : 1" :max="100" :step="1" :precision="0" @change="doPercentChange" controls-position="right" style="width: 220px">
|
||||||
v-model="form.schedulePercent"
|
|
||||||
placeholder="请输入当前完成进度"
|
|
||||||
:min="
|
|
||||||
previousSchedule.schedulePercent ? previousSchedule.schedulePercent : 1
|
|
||||||
"
|
|
||||||
:max="100"
|
|
||||||
:step="1"
|
|
||||||
:precision="0"
|
|
||||||
controls-position="right"
|
|
||||||
style="width: 220px"
|
|
||||||
>
|
|
||||||
<template #suffix>
|
<template #suffix>
|
||||||
<span>%</span>
|
<span>%</span>
|
||||||
</template>
|
</template>
|
||||||
|
@ -221,48 +106,20 @@
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-alert
|
<el-alert v-if="previousSchedule.schedulePercent" :title="'上次完成进度 ' + previousSchedule.schedulePercent + '%'" type="warning" show-icon :closable="false" />
|
||||||
v-if="previousSchedule.schedulePercent"
|
|
||||||
:title="'上次完成进度 ' + previousSchedule.schedulePercent + '%'"
|
|
||||||
type="warning"
|
|
||||||
show-icon
|
|
||||||
:closable="false"
|
|
||||||
/>
|
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
<el-form-item
|
<el-form-item label="完成时间" prop="finishDate" v-if="form.schedulePercent == 100">
|
||||||
label="完成时间"
|
<el-date-picker v-model="form.finishDate" type="date" value-format="YYYY-MM-DD" placeholder="请选择完成时间"> </el-date-picker>
|
||||||
prop="finishDate"
|
|
||||||
v-if="form.schedulePercent == 100"
|
|
||||||
>
|
|
||||||
<el-date-picker
|
|
||||||
v-model="form.finishDate"
|
|
||||||
type="date"
|
|
||||||
value-format="YYYY-MM-DD"
|
|
||||||
placeholder="请选择完成时间"
|
|
||||||
>
|
|
||||||
</el-date-picker>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="施工进度描述" prop="description">
|
<el-form-item label="施工进度描述" prop="description">
|
||||||
<el-input
|
<el-input v-model="form.description" type="textarea" placeholder="请输入施工进度描述" :autosize="{ minRows: 3, maxRows: 6 }" maxlength="999" show-word-limit />
|
||||||
v-model="form.description"
|
|
||||||
type="textarea"
|
|
||||||
placeholder="请输入施工进度描述"
|
|
||||||
:autosize="{ minRows: 3, maxRows: 6 }"
|
|
||||||
maxlength="999"
|
|
||||||
show-word-limit
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="施工作业图" prop="images">
|
<el-form-item label="施工作业图" prop="images">
|
||||||
<image-upload v-model="form.images" :limit="5" />
|
<image-upload v-model="form.images" :limit="5" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="填报时间" prop="createDate">
|
<el-form-item label="填报时间" prop="createDate">
|
||||||
<el-date-picker
|
<el-date-picker v-model="form.createDate" type="date" value-format="YYYY-MM-DD" placeholder="请选择填报时间" />
|
||||||
v-model="form.createDate"
|
|
||||||
type="date"
|
|
||||||
value-format="YYYY-MM-DD"
|
|
||||||
placeholder="请选择填报时间"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
|
@ -277,14 +134,7 @@
|
||||||
|
|
||||||
<script setup name="Schedule">
|
<script setup name="Schedule">
|
||||||
import { findOnlyPlan, findPlanDatas, findRecursionPlan } from "@/api/manage/plan";
|
import { findOnlyPlan, findPlanDatas, findRecursionPlan } from "@/api/manage/plan";
|
||||||
import {
|
import { listSchedule, getSchedule, delSchedule, addSchedule, updateSchedule, findPreviousSchedule } from "@/api/manage/schedule";
|
||||||
listSchedule,
|
|
||||||
getSchedule,
|
|
||||||
delSchedule,
|
|
||||||
addSchedule,
|
|
||||||
updateSchedule,
|
|
||||||
findPreviousSchedule,
|
|
||||||
} from "@/api/manage/schedule";
|
|
||||||
import useUserStore from "@/store/modules/user";
|
import useUserStore from "@/store/modules/user";
|
||||||
|
|
||||||
const { proxy } = getCurrentInstance();
|
const { proxy } = getCurrentInstance();
|
||||||
|
@ -321,13 +171,12 @@ const data = reactive({
|
||||||
rules: {
|
rules: {
|
||||||
projectId: [{ required: true, message: "项目名称不能为空", trigger: "blur" }],
|
projectId: [{ required: true, message: "项目名称不能为空", trigger: "blur" }],
|
||||||
planId: [{ required: true, message: "工程计划不能为空", trigger: "change" }],
|
planId: [{ required: true, message: "工程计划不能为空", trigger: "change" }],
|
||||||
schedulePercent: [
|
schedulePercent: [{ required: true, message: "当前完成进度不能为空", trigger: "blur" }],
|
||||||
{ required: true, message: "当前完成进度不能为空", trigger: "blur" },
|
|
||||||
],
|
|
||||||
finishDate: [{ required: true, message: "完成时间不能为空", trigger: "change" }],
|
finishDate: [{ required: true, message: "完成时间不能为空", trigger: "change" }],
|
||||||
description: [{ required: true, message: "施工进度描述不能为空", trigger: "blur" }],
|
description: [{ required: true, message: "施工进度描述不能为空", trigger: "blur" }],
|
||||||
images_1: [{ required: true, message: "施工作业图不能为空", trigger: "change" }],
|
images_1: [{ required: true, message: "施工作业图不能为空", trigger: "change" }],
|
||||||
},
|
},
|
||||||
|
allData: [],
|
||||||
});
|
});
|
||||||
|
|
||||||
const { queryParams, form, rules } = toRefs(data);
|
const { queryParams, form, rules } = toRefs(data);
|
||||||
|
@ -335,7 +184,7 @@ const { queryParams, form, rules } = toRefs(data);
|
||||||
/** 查询项目进度列表 */
|
/** 查询项目进度列表 */
|
||||||
function getList() {
|
function getList() {
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
queryParams.value.projectId=userStore.currentPrjId;
|
queryParams.value.projectId = userStore.currentPrjId;
|
||||||
listSchedule(queryParams.value).then((response) => {
|
listSchedule(queryParams.value).then((response) => {
|
||||||
scheduleList.value = response.rows;
|
scheduleList.value = response.rows;
|
||||||
total.value = response.total;
|
total.value = response.total;
|
||||||
|
@ -393,6 +242,18 @@ function handleSelectionChange(selection) {
|
||||||
multiple.value = !selection.length;
|
multiple.value = !selection.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 进度改变 */
|
||||||
|
function doPercentChange() {
|
||||||
|
form.value.finishDate = "";
|
||||||
|
form.value.createDate = "";
|
||||||
|
if (form.value.schedulePercent == 100) {
|
||||||
|
let plan = data.allData.find((it) => it.id == form.value.planId);
|
||||||
|
if (plan) {
|
||||||
|
form.value.finishDate = plan.planFinishDate || "";
|
||||||
|
form.value.createDate = plan.planFinishDate || "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
/** 新增按钮操作 */
|
/** 新增按钮操作 */
|
||||||
function handleAdd() {
|
function handleAdd() {
|
||||||
if (!userStore.currentComId) {
|
if (!userStore.currentComId) {
|
||||||
|
@ -495,6 +356,7 @@ function buildTree(all, id) {
|
||||||
/** 初始化计划管理 */
|
/** 初始化计划管理 */
|
||||||
function initPlanDatas(proId) {
|
function initPlanDatas(proId) {
|
||||||
findPlanDatas(proId).then((res) => {
|
findPlanDatas(proId).then((res) => {
|
||||||
|
data.allData = res.data || [];
|
||||||
let treeDatas = buildTree(res.data, 1);
|
let treeDatas = buildTree(res.data, 1);
|
||||||
planOptions.value = treeDatas;
|
planOptions.value = treeDatas;
|
||||||
});
|
});
|
||||||
|
|
|
@ -144,7 +144,9 @@ function getList() {
|
||||||
dangerType: queryParams.value.dangerType,
|
dangerType: queryParams.value.dangerType,
|
||||||
lordSent: queryParams.value.lordSent,
|
lordSent: queryParams.value.lordSent,
|
||||||
createUser: queryParams.value.createUser,
|
createUser: queryParams.value.createUser,
|
||||||
checkState: " abcde".indexOf(data.activeName)
|
checkState: " abcde".indexOf(data.activeName),
|
||||||
|
pageNum:queryParams.value.pageNum,
|
||||||
|
pageSize:queryParams.value.pageSize
|
||||||
};
|
};
|
||||||
if (queryParams.value.dataRange && queryParams.value.dataRange.length > 0) {
|
if (queryParams.value.dataRange && queryParams.value.dataRange.length > 0) {
|
||||||
postData.createTime = queryParams.value.dataRange[0];
|
postData.createTime = queryParams.value.dataRange[0];
|
||||||
|
|
|
@ -144,7 +144,9 @@ function getList() {
|
||||||
dangerType: queryParams.value.dangerType,
|
dangerType: queryParams.value.dangerType,
|
||||||
lordSent: queryParams.value.lordSent,
|
lordSent: queryParams.value.lordSent,
|
||||||
createUser: queryParams.value.createUser,
|
createUser: queryParams.value.createUser,
|
||||||
checkState: " abcde".indexOf(data.activeName)
|
checkState: " abcde".indexOf(data.activeName),
|
||||||
|
pageNum:queryParams.value.pageNum,
|
||||||
|
pageSize:queryParams.value.pageSize
|
||||||
};
|
};
|
||||||
if (queryParams.value.dataRange && queryParams.value.dataRange.length > 0) {
|
if (queryParams.value.dataRange && queryParams.value.dataRange.length > 0) {
|
||||||
postData.createTime = queryParams.value.dataRange[0];
|
postData.createTime = queryParams.value.dataRange[0];
|
||||||
|
|
Loading…
Reference in New Issue