riku
2025-02-28 3d6addd2c0817b30bd328605cb048ca9698742a6
修复新建子任务时,未提前建立日任务的bug
已修改15个文件
已添加2个文件
882 ■■■■■ 文件已修改
src/api/fysp/problemApi.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components.d.ts 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/check/components/ComChangeEdit.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/check/components/CompProblemAddOrUpd.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/check/components/CompProblemCard.vue 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/data-product/base-data-product/ProdMonitorTaskInfo.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/data-product/base-data-product/ProdScenseInfo.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/data-product/base-data-product/ProdTreatmentDeviceInfo.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/evaluation/EvalutationRecord.vue 73 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/scene/CompSceneMixingPlantInfo.vue 338 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/scene/CompSceneWharfInfo.vue 305 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/task/TaskManage.vue 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/task/components/CompDayTask.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/task/components/CompMonitorPlan.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/task/components/CompSubTaskList.vue 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/task/components/CompSubTaskSelect.vue 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/task/components/CompTaskEdit.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/fysp/problemApi.js
@@ -15,7 +15,7 @@
  fetchProblemType({ cityCode, districtCode, sceneTypeId }) {
    const params = `?taskTypeId=1&cityCode=${cityCode}&districtCode=${districtCode}&sceneTypeId=${sceneTypeId}`;
    return $fysp.get(`problemtype/search${params}`).then((res) => res);
    return $fysp.get(`problemtype/search${params}`).then((res) => res.data);
  },
  /**
src/components.d.ts
@@ -13,22 +13,32 @@
    CompGenericWrapper: typeof import('./components/CompGenericWrapper.vue')['default']
    CompQuickSet: typeof import('./components/search-option/CompQuickSet.vue')['default']
    Content: typeof import('./components/core/Content.vue')['default']
    ElAffix: typeof import('element-plus/es')['ElAffix']
    ElAside: typeof import('element-plus/es')['ElAside']
    ElAvatar: typeof import('element-plus/es')['ElAvatar']
    ElBadge: typeof import('element-plus/es')['ElBadge']
    ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb']
    ElBreadcrumbItem: typeof import('element-plus/es')['ElBreadcrumbItem']
    ElButton: typeof import('element-plus/es')['ElButton']
    ElButtonGroup: typeof import('element-plus/es')['ElButtonGroup']
    ElCalendar: typeof import('element-plus/es')['ElCalendar']
    ElCard: typeof import('element-plus/es')['ElCard']
    ElCascader: typeof import('element-plus/es')['ElCascader']
    ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
    ElCol: typeof import('element-plus/es')['ElCol']
    ElCollapse: typeof import('element-plus/es')['ElCollapse']
    ElCollapseItem: typeof import('element-plus/es')['ElCollapseItem']
    ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
    ElContainer: typeof import('element-plus/es')['ElContainer']
    ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
    ElDescriptions: typeof import('element-plus/es')['ElDescriptions']
    ElDescriptionsItem: typeof import('element-plus/es')['ElDescriptionsItem']
    ElDialog: typeof import('element-plus/es')['ElDialog']
    ElDivider: typeof import('element-plus/es')['ElDivider']
    ElDrawer: typeof import('element-plus/es')['ElDrawer']
    ElDropdown: typeof import('element-plus/es')['ElDropdown']
    ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem']
    ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu']
    ElEmpty: typeof import('element-plus/es')['ElEmpty']
    ElForm: typeof import('element-plus/es')['ElForm']
    ElFormItem: typeof import('element-plus/es')['ElFormItem']
@@ -37,25 +47,37 @@
    ElImage: typeof import('element-plus/es')['ElImage']
    ElImageViewer: typeof import('element-plus/es')['ElImageViewer']
    ElInput: typeof import('element-plus/es')['ElInput']
    ElInputNumber: typeof import('element-plus/es')['ElInputNumber']
    ElLink: typeof import('element-plus/es')['ElLink']
    ElMain: typeof import('element-plus/es')['ElMain']
    ElMenu: typeof import('element-plus/es')['ElMenu']
    ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
    ElMenuItemGroup: typeof import('element-plus/es')['ElMenuItemGroup']
    ElOption: typeof import('element-plus/es')['ElOption']
    ElPageHeader: typeof import('element-plus/es')['ElPageHeader']
    ElPagination: typeof import('element-plus/es')['ElPagination']
    ElPopconfirm: typeof import('element-plus/es')['ElPopconfirm']
    ElPopover: typeof import('element-plus/es')['ElPopover']
    ElRadio: typeof import('element-plus/es')['ElRadio']
    ElRadioButton: typeof import('element-plus/es')['ElRadioButton']
    ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
    ElRow: typeof import('element-plus/es')['ElRow']
    ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
    ElSegmented: typeof import('element-plus/es')['ElSegmented']
    ElSelect: typeof import('element-plus/es')['ElSelect']
    ElSpace: typeof import('element-plus/es')['ElSpace']
    ElStep: typeof import('element-plus/es')['ElStep']
    ElSteps: typeof import('element-plus/es')['ElSteps']
    ElSubMenu: typeof import('element-plus/es')['ElSubMenu']
    ElSwitch: typeof import('element-plus/es')['ElSwitch']
    ElTable: typeof import('element-plus/es')['ElTable']
    ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
    ElTabPane: typeof import('element-plus/es')['ElTabPane']
    ElTabs: typeof import('element-plus/es')['ElTabs']
    ElTag: typeof import('element-plus/es')['ElTag']
    ElText: typeof import('element-plus/es')['ElText']
    ElTooltip: typeof import('element-plus/es')['ElTooltip']
    ElTransfer: typeof import('element-plus/es')['ElTransfer']
    ElTree: typeof import('element-plus/es')['ElTree']
    ElUpload: typeof import('element-plus/es')['ElUpload']
    Footer: typeof import('./components/core/Footer.vue')['default']
src/views/fysp/check/components/ComChangeEdit.vue
@@ -126,7 +126,7 @@
  mounted() {},
  methods: {
    pictureValidate() {
      if (this.changeType == 1 && this.fileList.length < 1) {
      if (this.fileList.length < 1) {
        ElMessage({
          message: '至少上传一张图片',
          type: 'error'
src/views/fysp/check/components/CompProblemAddOrUpd.vue
@@ -422,7 +422,7 @@
        districtCode: this.topTask.districtcode
      };
      problemApi.fetchProblemType(data).then((res) => {
        this.problemTypeList = res.data;
        this.problemTypeList = res;
        if (this.type == 1) {
          let currProName = String(this.problem.problemname);
src/views/fysp/check/components/CompProblemCard.vue
@@ -38,7 +38,7 @@
      >
    </el-descriptions>
    <el-scrollbar>
    <el-scrollbar style="width: 70%;">
      <el-descriptions
        title=" "
        :column="2"
@@ -423,6 +423,7 @@
  width: 240px;
  height: 250px;
  border-radius: 4px;
  margin-bottom: 6px;
}
.d-index {
@@ -446,14 +447,14 @@
.d-extra {
}
.descriptions-label-1 {
  color: whitesmoke;
  background: var(--el-color-danger-light-3);
:deep(.descriptions-label-1) {
  /* color: whitesmoke; */
  /* background: var(--el-color-danger-light-3); */
}
.descriptions-label-2 {
  color: whitesmoke;
  background-color: var(--el-color-success-light-3);
  /* color: whitesmoke; */
  /* background-color: var(--el-color-success-light-3); */
}
</style>
src/views/fysp/data-product/base-data-product/ProdMonitorTaskInfo.vue
@@ -0,0 +1,4 @@
<template>
  1
</template>
<script></script>
src/views/fysp/data-product/base-data-product/ProdScenseInfo.vue
@@ -0,0 +1,4 @@
<template>
  1
</template>
<script></script>
src/views/fysp/data-product/base-data-product/ProdTreatmentDeviceInfo.vue
@@ -0,0 +1,4 @@
<template>
  1
</template>
<script></script>
src/views/fysp/evaluation/EvalutationRecord.vue
@@ -23,7 +23,11 @@
        v-model:value="formSearch.scenetype"
      ></FYOptionScene>
      <!-- æ—¶é—´ -->
      <FYOptionTime :initValue="false" type="month" v-model:value="formSearch.time"></FYOptionTime>
      <FYOptionTime
        :initValue="false"
        type="month"
        v-model:value="formSearch.time"
      ></FYOptionTime>
    </template>
    <template #buttons>
      <!-- <el-button icon="Download" size="default" type="success" @click="download"
@@ -43,9 +47,20 @@
    </template>
    <template #table-column="{ size }">
      <el-table-column fixed="left" sortable="custom" prop="sceneIndex" label="编号" width="80">
      <el-table-column
        fixed="left"
        sortable="custom"
        prop="sceneIndex"
        label="编号"
        width="80"
      >
      </el-table-column>
      <el-table-column prop="sceneName" :show-overflow-tooltip="true" label="名称" width="300">
      <el-table-column
        prop="sceneName"
        :show-overflow-tooltip="true"
        label="名称"
        width="300"
      >
      </el-table-column>
      <el-table-column
        prop="subTaskTime"
@@ -54,10 +69,21 @@
        sortable="custom"
        :formatter="timeFormat"
      />
      <el-table-column prop="evaluation.resultscorebef" label="得分" width="90" sortable="custom" />
      <el-table-column prop="evaluation.resultscorebef" label="环信码" width="100">
      <el-table-column
        prop="evaluation.resultscorebef"
        label="得分"
        width="90"
        sortable="custom"
      />
      <el-table-column
        prop="evaluation.resultscorebef"
        label="环信码"
        width="100"
      >
        <template #default="{ row }">
          <span :style="`color: ${toCode(row).color};`">{{ toCode(row).name }}</span>
          <span :style="`color: ${toCode(row).color};`">{{
            toCode(row).name
          }}</span>
        </template>
      </el-table-column>
@@ -112,12 +138,18 @@
            :loading="updateLoading"
            >上传</el-button
          >
          <el-button v-show="scoreShow" size="small" type="error" @click="scoreShow = false"
          <el-button
            v-show="scoreShow"
            size="small"
            type="error"
            @click="scoreShow = false"
            >取消</el-button
          >
        </template>
        <template #default="{ row }">
          <el-button type="primary" size="small" @click="editRow(row)">查看</el-button>
          <el-button type="primary" size="small" @click="editRow(row)"
            >查看</el-button
          >
        </template>
      </el-table-column>
    </template>
@@ -135,12 +167,25 @@
export default {
  setup() {
    const { cellClick, cellClassName, handlePaste, setTableData, addRefreshEvent, tableData } =
      useTablePaste({
    const {
      cellClick,
      cellClassName,
      handlePaste,
      setTableData,
      addRefreshEvent,
      tableData
    } = useTablePaste({
        score1: 8,
        score2: 9
      });
    return { cellClick, cellClassName, handlePaste, setTableData, addRefreshEvent, tableData };
    return {
      cellClick,
      cellClassName,
      handlePaste,
      setTableData,
      addRefreshEvent,
      tableData
    };
  },
  components: { CompReport },
  data() {
@@ -248,7 +293,9 @@
        if (res.data.length > 0) {
          this.evaluationRule = res.data[0];
          // èŽ·å–å…·ä½“å­è§„åˆ™
          return evaluateApi.getSubRules(this.evaluationRule.guid).then((res) => {
          return evaluateApi
            .getSubRules(this.evaluationRule.guid)
            .then((res) => {
            this.evaluationSubRule = res.data;
            // æŸ¥æ‰¾å¯å¯¼å…¥å¾—分的规则id
            for (const key in this.ruleName) {
@@ -256,8 +303,10 @@
              const subrule = this.evaluationSubRule.find((v) => {
                return v.itemname == value.name;
              });
                if (subrule) {
              value.id = subrule.guid;
            }
              }
          });
        }
      });
src/views/fysp/scene/CompSceneMixingPlantInfo.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,338 @@
<!-- æ…拌站专属信息编辑 -->
<template>
  <BaseSceneInfo ref="baseSceneInfo" :scene="scene" :formInfo="formInfo" :scene-type="sceneType">
    <template #form-items>
      <el-form
        v-show="showStyle == 'form'"
        :inline="false"
        :model="formObj"
        ref="formRef"
        :rules="rules"
        label-position="right"
        label-width="150px"
      >
        <!-- <el-form-item label="运营状态" prop="mpStatus">
      <el-select v-model="formObj.mpStatus" placeholder="运营状态">
        <el-option
          v-for="s in status"
          :key="s.value"
          :label="s.label"
          :value="s.value"
        />
      </el-select>
    </el-form-item> -->
        <el-form-item label="占地面积" prop="mpFloorSpace">
          <el-input
            clearable
            v-model="formObj.mpFloorSpace"
            placeholder="占地面积"
          >
            <template #append>㎡</template>
          </el-input>
        </el-form-item>
        <el-form-item label="规划面积" prop="mpPlanningArea">
          <el-input
            clearable
            v-model="formObj.mpPlanningArea"
            placeholder="规划面积"
          >
            <template #append>㎡</template>
          </el-input>
        </el-form-item>
        <el-form-item label="业主单位" prop="mpEmployerUnit">
          <el-input
            clearable
            v-model="formObj.mpEmployerUnit"
            placeholder="业主单位"
          />
        </el-form-item>
        <el-form-item label="业主单位联系人" prop="mpEmployerContacts">
          <el-input
            clearable
            v-model="formObj.mpEmployerContacts"
            placeholder="业主单位联系人"
          />
        </el-form-item>
        <el-form-item
          label="业主单位联系电话"
          prop="mpEmployerContactsTel"
          class="input-with-select"
        >
          <el-input
            clearable
            type="tel"
            v-model="formObj.mpEmployerContactsTel"
            placeholder="业主单位联系电话"
          >
            <template #prepend>
              <el-icon><Iphone /></el-icon>
            </template>
          </el-input>
        </el-form-item>
        <el-form-item label="是否为绿色环保站厂" prop="mpGreenPlant">
          <el-select
            v-model="formObj.mpGreenPlant"
            placeholder="是否为绿色环保站厂"
          >
            <el-option
              v-for="s in [
                { value: false, label: '否' },
                { value: true, label: '是' }
              ]"
              :key="s.value"
              :label="s.label"
              :value="s.value"
            />
          </el-select>
        </el-form-item>
        <el-form-item label="是否为文明场站" prop="mpCivillyPlant">
          <el-select
            v-model="formObj.mpCivillyPlant"
            placeholder="是否为文明场站"
          >
            <el-option
              v-for="s in [
                { value: false, label: '否' },
                { value: true, label: '是' }
              ]"
              :key="s.value"
              :label="s.label"
              :value="s.value"
            />
          </el-select>
        </el-form-item>
        <el-form-item>
          <el-button
            :disabled="!edit"
            type="primary"
            @click="onSubmit"
            :loading="loading"
            >提交</el-button
          >
          <el-button :disabled="!edit" @click="onReset">重置</el-button>
        </el-form-item>
      </el-form>
    </template>
    <template #description-items>
      <el-descriptions
        v-show="showStyle == 'descriptions'"
        :column="2"
        :size="fontSize"
        direction="horizontal"
        border
      >
        <template #title>
          <el-text tag="h1">{{ title }}</el-text>
        </template>
        <template #extra>
          <el-button
            :size="fontSize"
            type="primary"
            @click="onSubmit"
            :loading="loading"
            >提交</el-button
          >
          <el-button
            :size="fontSize"
            :disabled="!edit && !ignoreEdit"
            @click="onReset"
            >重置</el-button
          >
        </template>
        <el-descriptions-item label="占地面积"
            ><el-input
              :size="fontSize"
              clearable
              v-model="formObj.mpFloorSpace"
              placeholder="占地面积"
            >
              <template #append>㎡</template>
            </el-input></el-descriptions-item
          >
          <el-descriptions-item label="规划面积"
            ><el-input
              :size="fontSize"
              clearable
              v-model="formObj.mpPlanningArea"
              placeholder="规划面积"
            >
              <template #append>㎡</template>
            </el-input></el-descriptions-item
          >
          <el-descriptions-item label="业主单位">
            <el-input
              clearable
              v-model="formObj.mpEmployerUnit"
              placeholder="业主单位"
            />
          </el-descriptions-item>
          <el-descriptions-item label="业主单位联系人">
            <el-input
              clearable
              v-model="formObj.mpEmployerContacts"
              placeholder="业主单位联系人"
            />
          </el-descriptions-item>
          <el-descriptions-item
            label="业主单位联系电话"
            prop="mpEmployerContactsTel"
            class="input-with-select"
            :span="2"
          >
            <el-input
              clearable
              type="tel"
              v-model="formObj.mpEmployerContactsTel"
              placeholder="业主单位联系电话"
            >
              <template #prepend>
                <el-icon><Iphone /></el-icon>
              </template>
            </el-input>
          </el-descriptions-item>
          <el-descriptions-item label="是否为绿色环保站厂">
            <el-select
              v-model="formObj.mpGreenPlant"
              placeholder="是否为绿色环保站厂"
            >
              <el-option
                v-for="s in [
                  { value: false, label: '否' },
                  { value: true, label: '是' }
                ]"
                :key="s.value"
                :label="s.label"
                :value="s.value"
              />
            </el-select>
          </el-descriptions-item>
          <el-descriptions-item label="是否为文明场站">
            <el-select
              v-model="formObj.mpCivillyPlant"
              placeholder="是否为文明场站"
            >
              <el-option
                v-for="s in [
                  { value: false, label: '否' },
                  { value: true, label: '是' }
                ]"
                :key="s.value"
                :label="s.label"
                :value="s.value"
              />
            </el-select>
          </el-descriptions-item>
          <el-descriptions-item label="施工地址" span="2"
            ><el-input
              clearable
              v-model="sceneObj.location"
              placeholder="施工地址"
              :size="fontSize"
          /></el-descriptions-item>
          <el-descriptions-item label="项目负责人"
            ><el-input
              :size="fontSize"
              clearable
              v-model="sceneObj.contacts"
              placeholder="项目负责人"
          /></el-descriptions-item>
          <el-descriptions-item label="项目负责人电话"
            ><el-input
              :size="fontSize"
              clearable
              type="tel"
              v-model="sceneObj.contactst"
              placeholder="项目负责人电话"
            >
              <template #prepend>
                <el-icon><Iphone /></el-icon>
              </template> </el-input
          ></el-descriptions-item>
      </el-descriptions>
    </template>
  </BaseSceneInfo>
</template>
<script setup>
import { reactive, ref, watch, computed } from 'vue';
import { useFormConfirm } from '@/composables/formConfirm';
import BaseSceneInfo from './BaseSceneInfo.vue';
const props = defineProps({
  scene: Object,
  //工地额外信息
  formInfo: Object,
  //场景类型:工地
  sceneType: {
    type: Number,
    default: 1
  },
  // å±•示样式 form:表单;descriptions:描述列表
  showStyle: {
    type: String,
    default: 'descriptions'
    // default:'form'
  },
  title: String
});
const fontSize = ref('small');
const emit = defineEmits([
  'onSubmit',
  'onCancel',
  'update:scene',
  'update:formInfo'
]);
const sceneObj = ref({});
const { formObj, formRef, edit, onSubmit, onReset } = useFormConfirm({
  submit: {
    do: submit
  },
  cancel: {
    do: cancel
  }
});
const ignoreEdit = computed(() => props.showStyle == 'descriptions');
const loading = ref(false);
const status = reactive([]);
const rules = reactive({});
const baseSceneInfo = ref(null);
function submit() {
  return baseSceneInfo.value.submit()
}
function cancel() {
  emit('onCancel');
}
watch(
  () => props.formInfo,
  (nValue) => {
    if (nValue) {
      formObj.value = nValue;
    }
  },
  { deep: false, immediate: true }
);
watch(
  () => props.scene,
  (nValue) => {
    if (nValue) {
      sceneObj.value = nValue;
    }
  },
  { deep: false, immediate: true }
);
</script>
<style>
/* .input-with-select .el-input-group__prepend {
  background-color: var(--el-fill-color-blank);
} */
.sub-title {
  font-size: var(--el-font-size-large);
  margin-bottom: 20px;
  margin-left: 20px;
}
</style>
src/views/fysp/scene/CompSceneWharfInfo.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,305 @@
<!-- ç å¤´ä¸“属信息编辑 -->
<template>
  <BaseSceneInfo ref="baseSceneInfo" :scene="scene" :formInfo="formInfo" :scene-type="sceneType">
    <template #form-items>
      <el-form
        v-show="showStyle == 'form'"
        :inline="false"
        :model="formObj"
        ref="formRef"
        :rules="rules"
        label-position="right"
        label-width="150px"
      >
        <el-form-item label="类型" prop="wProjectType">
          <el-input
            clearable
            v-model="formObj.wProjectType"
            placeholder="类型"
          />
        </el-form-item>
        <!-- <el-form-item label="运营状态" prop="wStatus">
      <el-select v-model="formObj.wStatus" placeholder="运营状态">
        <el-option
          v-for="s in status"
          :key="s.value"
          :label="s.label"
          :value="s.value"
        />
      </el-select>
    </el-form-item> -->
        <el-form-item label="业主单位" prop="wEmployerUnit">
          <el-input
            clearable
            v-model="formObj.wEmployerUnit"
            placeholder="业主单位"
          />
        </el-form-item>
        <el-form-item label="业主单位联系人" prop="wEmployerContacts">
          <el-input
            clearable
            v-model="formObj.wEmployerContacts"
            placeholder="业主单位联系人"
          />
        </el-form-item>
        <el-form-item
          label="业主单位联系电话"
          prop="wEmployerContactsTel"
          class="input-with-select"
        >
          <el-input
            clearable
            type="tel"
            v-model="formObj.wEmployerContactsTel"
            placeholder="业主单位联系电话"
          >
            <template #prepend>
              <el-icon><Iphone /></el-icon>
            </template>
          </el-input>
        </el-form-item>
        <el-form-item label="租赁单位" prop="wRentUnit">
          <el-input
            clearable
            v-model="formObj.wRentUnit"
            placeholder="租赁单位"
          />
        </el-form-item>
        <el-form-item label="租赁单位联系人" prop="wRentContacts">
          <el-input
            clearable
            v-model="formObj.wRentContacts"
            placeholder="租赁单位联系人"
          />
        </el-form-item>
        <el-form-item label="租赁单位联系人电话" prop="wRentContactsTel">
          <el-input
            clearable
            type="tel"
            v-model="formObj.wRentContactsTel"
            placeholder="租赁单位联系人电话"
          >
            <template #prepend>
              <el-icon><Iphone /></el-icon>
            </template>
          </el-input>
        </el-form-item>
        <el-form-item>
          <el-button
            :disabled="!edit"
            type="primary"
            @click="onSubmit"
            :loading="loading"
            >提交</el-button
          >
          <el-button :disabled="!edit" @click="onReset">重置</el-button>
        </el-form-item>
      </el-form>
    </template>
    <template #description-items>
      <el-descriptions
        v-show="showStyle == 'descriptions'"
        :column="2"
        :size="fontSize"
        direction="horizontal"
        border
      >
        <template #title>
          <el-text tag="h1">{{ title }}</el-text>
        </template>
        <template #extra>
          <el-button
            :disabled="!edit && !ignoreEdit"
            :size="fontSize"
            type="primary"
            @click="onSubmit"
            :loading="loading"
            >提交</el-button
          >
          <el-button
            :size="fontSize"
            :disabled="!edit && !ignoreEdit"
            @click="onReset"
            >重置</el-button
          >
        </template>
        <el-descriptions-item label="类型" :span="2"
          ><el-input
            :size="fontSize"
            clearable
            v-model="formObj.wProjectType"
            placeholder="类型"
        /></el-descriptions-item>
        <el-descriptions-item label="占地面积"
          ><el-input
            :size="fontSize"
            clearable
            v-model="formObj.wFloorSpace"
            placeholder="占地面积"
          >
            <template #append>㎡</template>
          </el-input></el-descriptions-item
        >
        <el-descriptions-item label="规划面积"
          ><el-input
            :size="fontSize"
            clearable
            v-model="formObj.wPlanningArea"
            placeholder="规划面积"
          >
            <template #append>㎡</template>
          </el-input></el-descriptions-item
        >
        <el-descriptions-item label="业主单位">
          <el-input
            clearable
            v-model="formObj.wEmployerUnit"
            placeholder="业主单位"
          />
        </el-descriptions-item>
        <el-descriptions-item label="业主单位联系人">
          <el-input
            clearable
            v-model="formObj.wEmployerContacts"
            placeholder="业主单位联系人"
          />
        </el-descriptions-item>
        <el-descriptions-item
          label="业主单位联系电话"
          prop="mpEmployerContactsTel"
          class="input-with-select"
          :span="2"
        >
          <el-input
            clearable
            type="tel"
            v-model="formObj.wEmployerContactsTel"
            placeholder="业主单位联系电话"
          >
            <template #prepend>
              <el-icon><Iphone /></el-icon>
            </template>
          </el-input>
        </el-descriptions-item>
        <el-descriptions-item label="施工地址" span="2"
          ><el-input
            clearable
            v-model="sceneObj.location"
            placeholder="施工地址"
            :size="fontSize"
        /></el-descriptions-item>
        <el-descriptions-item label="项目负责人"
          ><el-input
            :size="fontSize"
            clearable
            v-model="sceneObj.contacts"
            placeholder="项目负责人"
        /></el-descriptions-item>
        <el-descriptions-item label="项目负责人电话"
          ><el-input
            :size="fontSize"
            clearable
            type="tel"
            v-model="sceneObj.contactst"
            placeholder="项目负责人电话"
          >
            <template #prepend>
              <el-icon><Iphone /></el-icon>
            </template> </el-input
        ></el-descriptions-item>
        <el-descriptions-item label="租赁单位"
          ><el-input
            :size="fontSize"
            clearable
            v-model="formObj.wRentUnit"
            placeholder="租赁单位"
        /></el-descriptions-item>
      </el-descriptions>
    </template>
  </BaseSceneInfo>
</template>
<script setup>
import { reactive, ref, watch, computed } from 'vue';
import { useFormConfirm } from '@/composables/formConfirm';
import BaseSceneInfo from './BaseSceneInfo.vue';
const props = defineProps({
  scene: Object,
  //工地额外信息
  formInfo: Object,
  //场景类型:工地
  sceneType: {
    type: Number,
    default: 1
  },
  // å±•示样式 form:表单;descriptions:描述列表
  showStyle: {
    type: String,
    default: 'descriptions'
    // default:'form'
  },
  title: String
});
const fontSize = ref('small');
const emit = defineEmits([
  'onSubmit',
  'onCancel',
  'update:scene',
  'update:formInfo'
]);
const sceneObj = ref({});
const { formObj, formRef, edit, onSubmit, onReset } = useFormConfirm({
  submit: {
    do: submit
  },
  cancel: {
    do: cancel
  }
});
const ignoreEdit = computed(() => props.showStyle == 'descriptions');
const loading = ref(false);
const status = reactive([]);
const rules = reactive({});
const baseSceneInfo = ref(null);
function submit() {
  return baseSceneInfo.value.submit()
}
function cancel() {
  emit('onCancel');
}
watch(
  () => props.formInfo,
  (nValue) => {
    if (nValue) {
      formObj.value = nValue;
    }
  },
  { deep: false, immediate: true }
);
watch(
  () => props.scene,
  (nValue) => {
    if (nValue) {
      sceneObj.value = nValue;
    }
  },
  { deep: false, immediate: true }
);
</script>
<style>
/* .input-with-select .el-input-group__prepend {
  background-color: var(--el-fill-color-blank);
} */
.sub-title {
  font-size: var(--el-font-size-large);
  margin-bottom: 20px;
  margin-left: 20px;
}
</style>
src/views/fysp/task/TaskManage.vue
@@ -51,8 +51,9 @@
                    create
                    v-model="curSubTaskList"
                    :loading="subTaskLoading"
                    :create-loading="daytaskLoading"
                    height="56vh"
                    @add="subTaskDrawer = true"
                    @add="handleAddSubtask"
                    @submit="handleSubtaskSubmit"
                  ></CompSubTaskList>
                </el-col>
@@ -115,6 +116,9 @@
</template>
<script>
import { unref } from 'vue';
import { useCloned } from '@vueuse/core';
import dayjs from 'dayjs';
import taskApi from '@/api/fysp/taskApi';
import CompMonitorObj from './components/CompMonitorObj.vue';
import CompMonitorPlan from './components/CompMonitorPlan.vue';
@@ -181,11 +185,18 @@
      subTaskDrawer: false,
      // å½“前选择的日任务
      curDayTask: {},
      curDay: undefined,
      daytaskLoading: false,
      // å½“前选择的日任务下的子任务
      curSubTaskList: undefined,
      subTaskLoading: false,
      // æ€»ä»»åŠ¡æ–°å¢žå¼¹å‡ºæ¡†
      topTaskAddVisible: false
    };
  },
  provide() {
    return {
      topTask: this.curTask
    };
  },
  computed: {
@@ -273,7 +284,8 @@
        }
      });
    },
    onDateChange(dayTask) {
    onDateChange(dayTask, day) {
      this.curDay = day;
      if (dayTask) {
        this.subTaskLoading = true;
        // this.subTaskDrawer = true;
@@ -286,6 +298,7 @@
          .finally(() => (this.subTaskLoading = false));
      } else {
        this.curSubTaskList = [];
        this.curDayTask = {};
      }
    },
    navToTaskCreate(value) {
@@ -302,6 +315,43 @@
      this.$refs.planRef
        .fetchDayTasks()
        .finally(() => (this.subTaskLoading = false));
    },
    handleAddSubtask() {
      // åˆ¤æ–­å½“日是否有日任务,若没有,先创建在跳转子任务创建界面
      if (this.curDayTask.guid) {
        this.subTaskDrawer = true;
      } else {
        const _dayTask = useCloned(this.curTask.data).cloned.value;
        const taskDate = dayjs(this.curDay);
        _dayTask.tsguid = _dayTask.tguid;
        _dayTask.tguid = null;
        _dayTask.levelnum = null;
        _dayTask.name = `${taskDate.format('YYYYå¹´MM月DD日')}${
          _dayTask.cityname
        }${_dayTask.districtname}${_dayTask.typename}任务`;
        _dayTask.starttime = taskDate.startOf('day').toDate();
        _dayTask.endtime = taskDate.endOf('day').millisecond(0).toDate();
        _dayTask.settime = dayjs().toDate();
        _dayTask.t1stverifytime = dayjs().toDate();
        _dayTask.runingstatus = '未执行';
        this.daytaskLoading = true;
        taskApi
          .putTask(_dayTask)
          .then((res) => {
            this.curDayTask = {
              guid: res.data.tguid,
              tsGuid: res.data.tsguid,
              changedTaskNum: 0,
              check: true,
              completeTaskNum: 0,
              date: res.data.starttime,
              totalTaskNum: 0
            };
            this.subTaskDrawer = true;
            this.handleSubtaskSubmit();
          })
          .finally(() => (this.daytaskLoading = false));
      }
    }
  },
  mounted() {
src/views/fysp/task/components/CompDayTask.vue
@@ -47,7 +47,7 @@
  </el-row>
</template>
<script setup>
import { ref, watch, onMounted } from 'vue';
import { ref, watch, onMounted, inject } from 'vue';
import { useCloned } from '@vueuse/core';
import { useRoute, useRouter } from 'vue-router';
import { ElMessage, ElNotification, ElMessageBox } from 'element-plus';
src/views/fysp/task/components/CompMonitorPlan.vue
@@ -135,7 +135,7 @@
  if (isDayEnable(e)) {
    const day = dayjs(e).format('YYYY-MM-DD');
    const t = computeDayTask(day);
    emit('dateChange', t);
    emit('dateChange', t, day);
  }
}
src/views/fysp/task/components/CompSubTaskList.vue
@@ -44,7 +44,11 @@
      <div v-else>
        <el-empty description="无任务记录" />
        <el-row v-if="create" justify="center">
          <el-button type="success" size="small" @click="add"
          <el-button
            type="success"
            size="small"
            :loading="createLoading"
            @click="add"
            >添加任务</el-button
          >
        </el-row>
@@ -81,7 +85,8 @@
  },
  // æ˜¯å¦æ˜¾ç¤ºæ·»åŠ ä»»åŠ¡æŒ‰é’®
  create: Boolean,
  loading: Boolean
  loading: Boolean,
  createLoading:Boolean,
});
const dialogVisible = ref(false);
src/views/fysp/task/components/CompSubTaskSelect.vue
@@ -70,16 +70,12 @@
/**
 * å·¡æŸ¥å­ä»»åŠ¡åˆ›å»º
 */
import { ref, reactive, watch, computed, onMounted } from 'vue';
import { ref, reactive, watch, computed, onMounted, inject } from 'vue';
import { ElMessageBox, ElNotification, ElMessage } from 'element-plus';
import taskApi from '@/api/fysp/taskApi';
import TaskProxy from '../TaskProxy';
onMounted(() => {
  // if (props.height) {
  //   scrollHeight.value =
  // }
});
// const topTask = inject('topTask');
const props = defineProps({
  // å­ä»»åŠ¡é›†åˆ
@@ -122,12 +118,16 @@
  } else {
    success();
    // å°†ä»»åŠ¡æ‰§è¡Œäººæ ¼å¼åŒ–å¹¶ä¼ é€’
    const param = TaskProxy.getExecutors(v.value.executor, executors.value)
    emit('submit', param)
    const param = TaskProxy.getExecutors(v.value.executor, executors.value);
    emit('submit', param);
  }
}
/************************* ä»»åŠ¡æ‰§è¡Œäººä¸‹æ‹‰é€‰æ¡† *******************************/
// onMounted(() => {
//   getExecutors(topTask.value);
// });
const executors = ref([]);
// æ˜¯å¦å…¨é€‰
const checkAll = ref(false);
@@ -142,14 +142,11 @@
    formInfo.value.executor = [];
  }
}
watch(
  () => props.dayTask,
  (nV, oV) => {
    if (nV != oV) {
      taskApi.fetchTaskById(nV.guid).then((res) => {
        const ids = res.executorguids.split('#');
        const userNames = res.executorusernames.split('#');
        const realNames = res.executorrealnames.split('#');
function getExecutors(t) {
  const ids = t.executorguids.split('#');
  const userNames = t.executorusernames.split('#');
  const realNames = t.executorrealnames.split('#');
        const list = [];
        ids.forEach((e, i) => {
          if (i < userNames.length && i < realNames.length) {
@@ -166,12 +163,25 @@
        });
        executors.value = list;
}
// watch(topTask, (nV, oV) => {
//   if (nV != oV) {
//     getExecutors(nV);
//   }
// });
watch(
  () => props.dayTask,
  (nV, oV) => {
    if (nV != oV) {
      taskApi.fetchTaskById(nV.guid).then((res) => {
        getExecutors(res);
      });
    }
  },
  { immediate: true }
);
//
watch(
  () => formInfo.value.executor,
  (val) => {
src/views/fysp/task/components/CompTaskEdit.vue
@@ -216,7 +216,7 @@
}
function genTaskName() {
  let name = dayjs(formRef.value.formObj._timeArr[0]).format('YYYYå¹´MM月');
  let name = dayjs(formRef.value.formObj._timeArr[0]).format('YYYYå¹´M月');
  name += locationText(formRef.value.formObj._locations);
  name += formRef.value.formObj._type.text;
  name += '任务';