hzj18279462576@163.com 1 éve
szülő
commit
08a1c5985f

+ 6 - 1
index.html

@@ -2,9 +2,14 @@
 <html lang="zh">
 <html lang="zh">
   <head>
   <head>
     <meta charset="UTF-8" />
     <meta charset="UTF-8" />
-    <link rel="icon" type="image/svg+xml" href="./src/assets/icon/process.png" />
+    <link
+      rel="icon"
+      type="image/svg+xml"
+      href="./src/assets/icon/process.png"
+    />
     <!-- <meta name="viewport" content="width=device-width, initial-scale=1.0" /> -->
     <!-- <meta name="viewport" content="width=device-width, initial-scale=1.0" /> -->
     <meta name="referrer" content="no-referrer" />
     <meta name="referrer" content="no-referrer" />
+    <link rel="resource" type="application/l10n" href="./viewer.properties" />
     <title>项目过程管理系统</title>
     <title>项目过程管理系统</title>
   </head>
   </head>
 
 

+ 1 - 5
src/components/PDFViewer.vue

@@ -1,10 +1,6 @@
 <template>
 <template>
     <!-- viewer.properties: 该文件已放置本地,使用相对路径引入,亦可放置cdn上,使用网络路径引入 -->
     <!-- viewer.properties: 该文件已放置本地,使用相对路径引入,亦可放置cdn上,使用网络路径引入 -->
-    <link
-      rel="resource"
-      type="application/l10n"
-      href="/src/assets/files/viewer.properties"
-    />
+    
     <VuePdfApp
     <VuePdfApp
       :page-scale="pageScale"
       :page-scale="pageScale"
       :theme="theme"
       :theme="theme"

+ 228 - 564
src/views/homePage/homePage.vue

@@ -668,7 +668,6 @@
                 >
                 >
                 <template #dropdown>
                 <template #dropdown>
                   <el-dropdown-menu>
                   <el-dropdown-menu>
-                    <!-- <el-dropdown-item>复制</el-dropdown-item> -->
                     <el-dropdown-item
                     <el-dropdown-item
                       @click.stop="editProject(i)"
                       @click.stop="editProject(i)"
                       v-if="activeName == 5"
                       v-if="activeName == 5"
@@ -691,23 +690,33 @@
           </div>
           </div>
           <div class="info">
           <div class="info">
             <div class="item">主办单位:{{ i.organize }}</div>
             <div class="item">主办单位:{{ i.organize }}</div>
-            <div class="item">主办人:{{ i.sposonerName }}</div>
-            <div class="item">协办人:{{ i.coSposonerName }}</div>
+            <div class="item">主办人:{{ i.headerName }}</div>
+            <!-- <div class="item">协办人:{{ i.coSposonerName }}</div> -->
             <div class="item">
             <div class="item">
               项目周期:{{ i.startTime }} ~ {{ i.endTime }}
               项目周期:{{ i.startTime }} ~ {{ i.endTime }}
             </div>
             </div>
             <!-- <div class="item">人员:{{ i.staffNum }}人</div> -->
             <!-- <div class="item">人员:{{ i.staffNum }}人</div> -->
-            <div class="item">任务:{{ i.taskNum }}个</div>
-            <div class="item">预警次数:{{ i.warnNum }}次</div>
-            <div class="item">提醒次数:{{ i.remindNum }}次</div>
+            <div>任务:{{ i.taskNum }}个</div>
+            <div
+              style="
+                display: flex;
+                align-items: center;
+                justify-content: space-between;
+              "
+            >
+              <div>
+                <div class="item">预警次数:{{ i.warnNum }}次</div>
+                <div class="item">提醒次数:{{ i.remindNum }}次</div>
+              </div>
+              <span class="score">{{ i.score }}<span style="font-size: 18px;">分</span></span>
+            </div>
             <div class="plan">
             <div class="plan">
               <span>项目进度:</span>
               <span>项目进度:</span>
               <el-progress
               <el-progress
-                :percentage="i.progress"
+                :percentage="i.progress*100"
                 color="rgba(0, 97, 255, 1)"
                 color="rgba(0, 97, 255, 1)"
               />
               />
               <img
               <img
-                v-if="activeName == 5 || activeName == 6"
                 title="催办"
                 title="催办"
                 @click.stop="urgeOneProject(i)"
                 @click.stop="urgeOneProject(i)"
                 src="../../assets/images/inform.png"
                 src="../../assets/images/inform.png"
@@ -719,240 +728,230 @@
       </div>
       </div>
     </div>
     </div>
 
 
-    <!-- 新建项目 -->
-    <el-dialog
-      class="project"
-      v-model="projectVisible"
+     <!-- 点击卡片弹窗 -->
+     <el-dialog
+      class="projectCard"
+      v-model="cardVisible"
       :close-on-click-modal="false"
       :close-on-click-modal="false"
       :close-on-press-escape="false"
       :close-on-press-escape="false"
-      :title="projectTitle"
+      :title="cardTitle"
       align-center
       align-center
-      width="600"
-      :before-close="cancelProject"
+      width="1400"
+      :before-close="cancelCard"
     >
     >
-      <el-form
-        ref="projectRef"
-        :model="projectRuleForm"
-        :rules="projectRules"
-        class="demo-ruleForm"
-        label-width="80px"
-        :size="formSize"
-        label-position="right"
-        status-icon
-      >
-        <el-form-item label="项目名称" prop="projectName">
-          <el-input
-            v-model="projectRuleForm.projectName"
-            placeholder="请输入项目名称"
-          />
-        </el-form-item>
-        <el-form-item label="项目描述" prop="projectContent">
-          <el-input
-            type="textarea"
-            :autosize="{ minRows: 6, maxRows: 8 }"
-            v-model="projectRuleForm.projectContent"
-            placeholder="请输入描述"
-            clearable
-          />
-        </el-form-item>
-        <el-form-item label="上传附件" prop="fileUrl">
-          <!-- <el-input
-            v-model="projectRuleForm.attachment"
-            placeholder="请上传附件"
-          >
-            <template #append>
-              <el-button
-                style="
-                  width: 100px;
-                  background-color: rgba(33, 107, 255, 1);
-                  color: #fff;
-                "
-                >上传</el-button
-              >
-            </template>
-          </el-input> -->
-          <div class="fujian">
-            <el-upload
-              class="avatar-uploader"
-              action=""
-              :on-change="handleChange"
-              :http-request="handleUpload"
+      <div>
+        <div class="title">项目情况</div>
+        <div class="info">{{ cardInfo.projectContent }}</div>
+        <el-divider />
+        <div class="unit">
+          <div class="unit_i">
+            <span class="key">主办单位 :</span>
+            <span class="value">{{ cardInfo.organize }}</span>
+          </div>
+          <div class="unit_i">
+            <span class="key">主办人 :</span>
+            <span class="value">{{ cardInfo.sposonerName }}</span>
+          </div>
+          <div class="unit_i">
+            <span class="key">协办单位 :</span>
+            <span class="value">{{ cardInfo.coOrganizeCopy }}</span>
+          </div>
+          <div class="unit_i">
+            <span class="key">协办人 :</span>
+            <span class="value">{{ cardInfo.coSposonerName }}</span>
+          </div>
+          <div class="unit_i">
+            <span class="key">分管领导 :</span>
+            <span class="value">{{ cardInfo.leaderName }}</span>
+          </div>
+          <div class="unit_i">
+            <span class="key">评分人 :</span>
+            <span class="value">{{ cardInfo.scorerName }}</span>
+          </div>
+          <div class="unit_i">
+            <span class="key">项目周期 :</span>
+            <span class="value"
+              >{{ cardInfo.startTime }} ~ {{ cardInfo.endTime }}</span
             >
             >
-              <el-button type="primary">上传附件</el-button>
-              <!-- <template #tip>
-              <div class="el-upload__tip">
-                jpg/png files with a size less than 500KB.
-              </div>
-            </template> -->
-            </el-upload>
-            <div v-if="fileList" class="fileList">
-              <div class="files" v-for="i in fileList">
-                {{ i
-                }}<el-icon @click="delFiles(i)" size="18">
-                  <CircleClose />
-                </el-icon>
+          </div>
+          <div class="unit_i">
+            <span class="key">项目等级 :</span>
+            <span class="value">{{ cardInfo.projectLevel }}</span>
+          </div>
+          <div class="unit_i">
+            <span class="key">项目来源 :</span>
+            <span class="value">{{ cardInfo.projectFrom }}</span>
+          </div>
+        </div>
+        <div class="unit" style="margin: 10px 0 20px">
+          <div class="unit_i">
+            <span class="key">附件 :</span>
+            <div class="fileList">
+              <div class="attachment" v-for="i in cardInfo.fileUrl">
+                <span @click="pdfChange(i)">{{ i }}</span>
+                <!-- <img style="height: 40px" :src="i" alt="" /> -->
               </div>
               </div>
             </div>
             </div>
           </div>
           </div>
-        </el-form-item>
-
-        <el-form-item label="主办人员" prop="sposoner">
-          <!-- <el-cascader :props="props" :options="options" /> -->
-          <el-cascader
-            :options="organizeData"
-            :props="organizeProps"
-            @change="organizeChange"
-            v-model="sposonerVal"
+        </div>
+        <div class="participation">
+          <el-button @click="logChange(1)" :class="logFlag == 1 ? 'active' : ''"
+            >项目进度</el-button
           >
           >
-            <template #default="{ node, data }">
-              <span>{{ data.userName }}</span>
-              <span v-if="!node.isLeaf"> ({{ data.userList.length }}) </span>
-            </template>
-          </el-cascader>
-        </el-form-item>
-        <el-form-item label="协办人员" prop="coSposoner">
-          <!-- <el-cascader :props="props" :options="options" /> -->
-          <el-cascader
-            :options="organizeData"
-            :props="coOrganizeProps"
-            collapse-tags
-            collapse-tags-tooltip
-            :max-collapse-tags="3"
-            clearable
-            @change="coOrganizeChange"
-            v-model="coSposonerVal"
+          <el-button @click="logChange(2)" :class="logFlag == 2 ? 'active' : ''"
+            >项目日志</el-button
           >
           >
-            <template #default="{ node, data }">
-              <span>{{ data.userName }}</span>
-              <span v-if="!node.isLeaf"> ({{ data.userList.length }}) </span>
-            </template>
-          </el-cascader>
-        </el-form-item>
-        <!-- <el-form-item label="主办单位" prop="organize">
-          <el-select
-            v-model="projectRuleForm.organize"
-            placeholder="请选择主办单位"
-            clearable
-            @change="getUser3"
+        </div>
+        <div v-if="logFlag == 1">
+          <div class="schedule">
+            <span>任务进度分(权重{{ cardInfo.progress }}%)</span>
+            <!-- <span>(注:评分维度为:任务完成质量40%)</span> -->
+          </div>
+          <el-table
+            :row-class-name="tableRowClassName"
+            :data="taskData"
+            @selection-change="handleSelectionChange"
+            style="width: 100%"
+            :header-cell-style="{
+              background: 'rgba(240, 243, 247, 1)',
+              height: '40px',
+              border: 0,
+            }"
           >
           >
-            <el-option
-              v-for="item in departmentData"
-              :key="item.oname"
-              :label="item.oname"
-              :value="item.oname"
+            <!-- <el-table-column type="selection" width="55" /> -->
+            <el-table-column align="center" prop="taskName" label="任务名称" />
+            <el-table-column
+              align="center"
+              width="250"
+              tooltip-effect
+              label="附件"
+            >
+              <template #default="scope">
+                <div v-if="scope.row.fileUrl">
+                  <div v-for="i in scope.row.fileUrl.split(',')">
+                    <div
+                      style="color: rgba(33, 107, 255, 1); cursor: pointer"
+                      @click="pdfChange(i)"
+                    >
+                      {{ i }}
+                    </div>
+                  </div>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column align="center" label="状态">
+              <template #default="scope">
+                <span v-if="scope.row.state == 1">正常在办</span>
+                <span v-if="scope.row.state == 2">预警在办</span>
+                <span v-if="scope.row.state == 3">超时在办</span>
+                <span v-if="scope.row.state == 4">正常办结</span>
+                <span v-if="scope.row.state == 5">超时办结</span>
+                <!-- 1、正常在办,2、预警在办,3、超时在办,4、正常办结,5、超时办结  -->
+              </template>
+            </el-table-column>
+            <el-table-column align="center" width="120" label="起止时间">
+              <template #default="scope">
+                <span>{{ scope.row.startTime }} ~ {{ scope.row.endTime }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column
+              align="center"
+              prop="remindTime"
+              label="提醒时间"
+              width="120"
             />
             />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="主办人" prop="sposoner">
-          <el-select
-            v-model="projectRuleForm.sposoner"
-            placeholder="请选择主办人"
-            clearable
-          >
-            <el-option
-              v-for="item in userData3"
-              :key="item.id"
-              :label="item.userName"
-              :value="item.id.toString()"
+            <el-table-column
+              align="center"
+              width="120"
+              prop="warnTime"
+              label="预警时间"
             />
             />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="协办单位" prop="coOrganize">
-          <el-select
-            v-model="projectRuleForm.coOrganize"
-            placeholder="请选择协办单位"
-            clearable
-            multiple
-            collapse-tags
-            collapse-tags-tooltip
-            :max-collapse-tags="3"
-            @change="getUser4"
-          >
-            <el-option
-              v-for="item in departmentData"
-              :key="item.oname"
-              :label="item.oname"
-              :value="item.oname"
+            <el-table-column
+              align="center"
+              width="120"
+              prop="finishTime"
+              label="完成时间"
             />
             />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="协办人" prop="coSposoner">
-          <el-select
-            v-model="projectRuleForm.coSposoner"
-            placeholder="请选择协办人"
-            clearable
-            multiple
-            collapse-tags
-            collapse-tags-tooltip
-            :max-collapse-tags="5"
-          >
-            <el-option
-              v-for="item in userData4"
-              :key="item.id"
-              :label="item.userName"
-              :value="item.id.toString()"
+            <el-table-column
+              align="center"
+              width="120"
+              prop="finishRemark"
+              tooltip-effect
+              label="完成备注"
             />
             />
-          </el-select>
-        </el-form-item> -->
-        <el-form-item label="项目来源" prop="projectFrom">
-          <el-select
-            v-model="projectRuleForm.projectFrom"
-            placeholder="请选择项目来源"
-            clearable
-          >
-            <el-option
-              v-for="item in projectOriginData"
-              :key="item.value"
-              :label="item.name"
-              :value="item.id"
+            <el-table-column
+              align="center"
+              prop="scoreStandard"
+              label="评价标准"
+              width="170"
             />
             />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="项目等级" prop="projectLevel">
-          <el-select
-            v-model="projectRuleForm.projectLevel"
-            placeholder="请选择项目等级"
-            clearable
-          >
-            <el-option
-              v-for="item in projectLevelData"
-              :key="item.value"
-              :label="item.name"
-              :value="item.id"
+            <el-table-column align="center" prop="weight" label="权重" />
+            <el-table-column
+              align="center"
+              prop="headerName"
+              label="任务负责人"
+              width="100"
             />
             />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="评分人" prop="scorer">
-          <el-select
-            v-model="projectRuleForm.scorer"
-            placeholder="请选择评分人"
-            clearable
-            multiple
-            collapse-tags
-            collapse-tags-tooltip
-            :max-collapse-tags="6"
-          >
-            <el-option
-              v-for="item in scorerData"
-              :key="item.id"
-              :label="item.userName"
-              :value="item.id.toString()"
+            <el-table-column
+              align="center"
+              prop="scoreLimit"
+              label="评分上限"
             />
             />
-          </el-select>
-        </el-form-item>
-        <el-form-item class="options">
+            <el-table-column align="center" prop="sysScore" label="系统" />
+          </el-table>
           <el-button
           <el-button
-            class="queding"
             type="primary"
             type="primary"
-            @click="confirmProject(projectRef)"
+            class="search"
+            @click="addTaskbtn"
+            v-if="activeName == 5"
+            >添加任务</el-button
           >
           >
-            &nbsp;&nbsp;确认&nbsp;&nbsp;
-          </el-button>
-          <el-button class="quxiao" @click="cancelProject"
-            >&nbsp;&nbsp;取消&nbsp;&nbsp;</el-button
+          <el-button
+            v-if="activeName == 6 && isScorer()"
+            type="primary"
+            class="search"
+            @click="scoreProjects"
+            >评分</el-button
+          >
+        </div>
+        <div v-if="logFlag == 2">
+          <el-table
+            :row-class-name="tableRowClassName"
+            :data="logData"
+            @selection-change="handleSelectionChange"
+            style="width: 100%"
+            :header-cell-style="{
+              background: 'rgba(240, 243, 247, 1)',
+              height: '40px',
+              border: 0,
+            }"
           >
           >
-        </el-form-item>
-      </el-form>
+            <!-- <el-table-column type="selection" width="55" /> -->
+            <el-table-column align="center" prop="taskName" label="任务名称" />
+            <el-table-column align="center" label="附件">
+              <template #default="scope">
+                <div v-if="scope.row.fileUrl">
+                  <div v-for="i in scope.row.fileUrl.split(',')">
+                    <div
+                      style="color: rgba(33, 107, 255, 1); cursor: pointer"
+                      @click="pdfChange(i)"
+                    >
+                      {{ i }}
+                    </div>
+                  </div>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column align="center" prop="content" label="内容" />
+            <el-table-column
+              align="center"
+              prop="createTime"
+              label="发生时间"
+            />
+            <el-table-column align="center" prop="createBy" label="操作人" />
+          </el-table>
+        </div>
+      </div>
     </el-dialog>
     </el-dialog>
   </div>
   </div>
 </template>
 </template>
@@ -1524,6 +1523,7 @@ const searchBtn = lodash.debounce(async () => {
 // 问题清单 预警清单 (=================================================)
 // 问题清单 预警清单 (=================================================)
 const problemClick = (val) => {
 const problemClick = (val) => {
   projectDesk.value = val;
   projectDesk.value = val;
+  getList()
 };
 };
 // 问题清单
 // 问题清单
 const getList = async () => {
 const getList = async () => {
@@ -1748,207 +1748,6 @@ const collectClick = async (row) => {
   }
   }
 };
 };
 
 
-// 新建项目 (-----------------------------------------------------------------)
-const addProjectbtn = () => {
-  projectVisible.value = true;
-  projectTitle.value = "新建项目";
-  fileList.value = [];
-  projectRuleForm.projectName = "";
-  projectRuleForm.projectContent = "";
-  projectRuleForm.fileUrl = "";
-
-  projectRuleForm.organize = "";
-  projectRuleForm.sposoner = "";
-  sposonerVal.value = "";
-
-  projectRuleForm.coOrganize = "";
-  projectRuleForm.coSposoner = "";
-  coSposonerVal.value = "";
-
-  projectRuleForm.projectFrom = "";
-  projectRuleForm.projectLevel = "";
-  projectRuleForm.id = "";
-};
-// 勾选主办人
-const organizeChange = async (val) => {
-  console.log(val);
-  return new Promise(async (resolve) => {
-    projectRuleForm.scorer = [];
-    if (val) {
-      projectRuleForm.organize = val[0];
-      projectRuleForm.sposoner = val[1];
-      let params = {
-        page: 1, // 当前页
-        rows: 1000, // 一页数据条数
-      };
-      let data = {
-        manageDepartment: projectRuleForm.organize, // 部门
-      };
-      let res = await axios({
-        method: "post",
-        url: api.value + "/api/sysUser/queryPage",
-        headers: {
-          tokenP: sessionStorage.getItem("tokenP"),
-          user_head: sessionStorage.getItem("userhead"),
-        },
-        params: params,
-        data: data,
-      });
-      console.log(res, "评分人列表");
-      if (res.data.code == 200) {
-        scorerData.value = res.data.data.rows;
-        resolve("success");
-      } else {
-        ElMessage({
-          type: "error",
-          showClose: true,
-          message: res.data.message,
-          center: true,
-        });
-      }
-    }
-  });
-};
-// 勾选协办人
-const coOrganizeChange = (val) => {
-  console.log(val);
-  if (val) {
-    let arr = [];
-    let jrr = [];
-    val.forEach((i) => {
-      arr.push(i[0]);
-      jrr.push(i[1]);
-    });
-    projectRuleForm.coOrganize = arr.join(",");
-    projectRuleForm.coSposoner = jrr.join(",");
-    console.log(arr.join(","), jrr.join(","));
-  }
-};
-//编辑项目
-const editProject = async (row) => {
-  projectVisible.value = true;
-  projectTitle.value = "编辑项目";
-  console.log(row);
-  fileList.value = row.fileUrl.split(",");
-  projectRuleForm.projectName = row.projectName;
-  projectRuleForm.projectContent = row.projectContent;
-  projectRuleForm.fileUrl = row.fileUrl.split(",");
-
-  projectRuleForm.organize = row.organize;
-  projectRuleForm.sposoner = row.sposoner;
-  console.log([row.organize, row.sposoner.toString()]);
-  sposonerVal.value = [row.organize, Number(row.sposoner)];
-
-  projectRuleForm.coSposoner = row.coSposoner;
-  projectRuleForm.coOrganize = row.coOrganize;
-  let arr = [];
-  row.coOrganize.split(",").forEach((item, ind) => {
-    console.log(item, ind);
-    arr.push([item, Number(row.coSposoner.split(",")[ind])]);
-  });
-  coSposonerVal.value = arr;
-
-  projectRuleForm.projectFrom = row.projectFrom;
-  projectRuleForm.projectLevel = row.projectLevel;
-  projectRuleForm.id = row.id;
-  await organizeChange([projectRuleForm.organize, projectRuleForm.sposoner]);
-  projectRuleForm.scorer = row.scorer.split(",");
-  // organizeChange([projectRuleForm.organize, projectRuleForm.sposoner]).then(
-  //   (res) => {
-  //     console.log(scorerData.value,res);
-  //     if (res == "success") {
-  //       projectRuleForm.scorer = row.scorer.split(",");
-  //     }
-  //   }
-  // );
-};
-// 确定新建项目
-const confirmProject = (formEl) => {
-  if (!formEl) return;
-  formEl.validate(async (valid, fields) => {
-    if (valid) {
-      let res = "";
-      let data = {
-        projectName: projectRuleForm.projectName,
-        projectFrom: projectRuleForm.projectFrom,
-        projectLevel: projectRuleForm.projectLevel,
-        projectContent: projectRuleForm.projectContent,
-        fileUrl: projectRuleForm.fileUrl.join(","),
-        organize: projectRuleForm.organize,
-        sposoner: projectRuleForm.sposoner,
-        coOrganize: projectRuleForm.coOrganize,
-        coSposoner: projectRuleForm.coSposoner,
-        scorer: projectRuleForm.scorer.join(","),
-      };
-      console.log(data);
-
-      // // 判断是否有id存在,有则是修改账号
-      if (projectRuleForm.id) {
-        data.id = projectRuleForm.id;
-        res = await axios({
-          method: "post",
-          url: api.value + "/api/sysProject/update",
-          headers: {
-            tokenP: sessionStorage.getItem("tokenP"),
-            user_head: sessionStorage.getItem("userhead"),
-          },
-          data: data,
-        });
-      } else {
-        res = await axios({
-          method: "post",
-          url: api.value + "/api/sysProject/add",
-          headers: {
-            tokenP: sessionStorage.getItem("tokenP"),
-            user_head: sessionStorage.getItem("userhead"),
-          },
-          data: data,
-        });
-      }
-      console.log(data, "添加参数");
-      console.log(res, "新增项目数据");
-      if (res.data.code == 200) {
-        projectVisible.value = false;
-        getList();
-        projectRef.value.resetFields();
-        ElMessage({
-          type: "success",
-          showClose: true,
-          message: res.data.message,
-          center: true,
-        });
-      } else {
-        ElMessage({
-          type: "error",
-          showClose: true,
-          message: res.data.message,
-          center: true,
-        });
-      }
-    }
-  });
-};
-// 取消新建项目
-const cancelProject = () => {
-  projectVisible.value = false;
-  projectRef.value.resetFields();
-  fileList.value = [];
-  projectRuleForm.projectName = "";
-  projectRuleForm.projectContent = "";
-  projectRuleForm.fileUrl = "";
-
-  projectRuleForm.organize = "";
-  projectRuleForm.sposoner = "";
-  sposonerVal.value = "";
-
-  projectRuleForm.coOrganize = "";
-  projectRuleForm.coSposoner = "";
-  coSposonerVal.value = "";
-
-  projectRuleForm.projectFrom = "";
-  projectRuleForm.projectLevel = "";
-  projectRuleForm.id = "";
-};
 
 
 // 催办所有项目
 // 催办所有项目
 const urgeProject = async () => {
 const urgeProject = async () => {
@@ -2075,51 +1874,6 @@ const delFiles = (val) => {
   projectRuleForm.fileUrl = fileList.value;
   projectRuleForm.fileUrl = fileList.value;
 };
 };
 
 
-// 删除项目
-const delProject = (row) => {
-  console.log(row);
-  console.log("删除项目");
-  ElMessageBox.confirm(`确定要删除<${row.projectName}>项目吗?`, "删除", {
-    confirmButtonText: "确定",
-    cancelButtonText: "取消",
-    type: "warning",
-  })
-    .then(async () => {
-      let data = new FormData();
-      data.append("id", row.id);
-      let res = await axios({
-        method: "post",
-        url: api.value + "/api/sysProject/del",
-        headers: {
-          tokenP: sessionStorage.getItem("tokenP"),
-          user_head: sessionStorage.getItem("userhead"),
-        },
-        data: data,
-      });
-      if (res.data.code == 200) {
-        getList();
-        ElMessage({
-          type: "success",
-          showClose: true,
-          message: res.data.message,
-          center: true,
-        });
-      } else {
-        ElMessage({
-          type: "error",
-          showClose: true,
-          message: res.data.message,
-          center: true,
-        });
-      }
-    })
-    .catch(() => {
-      ElMessage({
-        type: "info",
-        message: "Delete canceled",
-      });
-    });
-};
 
 
 // 新建任务 (******************************************************************)
 // 新建任务 (******************************************************************)
 const addTaskbtn = () => {
 const addTaskbtn = () => {
@@ -2723,7 +2477,7 @@ onUnmounted(() => {
 
 
       .el-card {
       .el-card {
         width: 370px;
         width: 370px;
-        height: 229px;
+        height: 219px;
         margin: 0 20px 20px 0;
         margin: 0 20px 20px 0;
         opacity: 1;
         opacity: 1;
         border-radius: 4px;
         border-radius: 4px;
@@ -2807,7 +2561,7 @@ onUnmounted(() => {
 
 
           .plan {
           .plan {
             display: flex;
             display: flex;
-
+            align-items: center;
             :deep(.el-progress-bar) {
             :deep(.el-progress-bar) {
               width: 180px;
               width: 180px;
             }
             }
@@ -2816,9 +2570,14 @@ onUnmounted(() => {
               width: 20px;
               width: 20px;
               height: 20px;
               height: 20px;
               cursor: pointer;
               cursor: pointer;
-              transform: translateY(-3px);
+              transform: translateY(-2px);
             }
             }
           }
           }
+
+          .score {
+            color: blueviolet;
+            font-size: 18px;
+          }
         }
         }
       }
       }
     }
     }
@@ -3081,101 +2840,6 @@ onUnmounted(() => {
       }
       }
     }
     }
   }
   }
-  // 项目新增样式
-  :deep(.project) {
-    // height: 300px;
-    border-radius: 11px;
-
-    .el-dialog__header {
-      border-radius: 11px 11px 0 0;
-      background: rgba(237, 241, 245, 1);
-      font-weight: 600;
-      margin: 0;
-      height: 32px;
-
-      .el-dialog__headerbtn {
-        outline: none;
-      }
-    }
-
-    .el-dialog__body {
-      padding: 30px 30px 0 30px;
-
-      .el-form {
-        .el-form-item {
-          .el-input {
-            width: 460px;
-
-            .el-input-group__append {
-              // padding: 0;
-            }
-          }
-
-          .el-textarea {
-            width: 460px;
-          }
-
-          .avatar-uploader {
-            .el-upload-list {
-              display: none;
-            }
-          }
-
-          .fileList {
-            .files {
-              padding: 0 5px;
-              display: flex;
-              align-items: center;
-
-              .el-icon {
-                cursor: pointer;
-                margin-left: 8px;
-              }
-
-              .el-icon:hover {
-                color: red;
-              }
-            }
-
-            .files:hover {
-              background-color: rgb(245, 247, 250);
-            }
-          }
-        }
-
-        .resetPassword {
-          color: rgba(43, 151, 252, 1);
-          padding-left: 40px;
-          display: inline-block;
-          margin-bottom: 15px;
-        }
-
-        .options {
-          margin: 60px 0 40px 0;
-
-          .el-form-item__content {
-            display: flex;
-            flex-direction: row-reverse;
-
-            .queding {
-              margin-left: 20px;
-              background: linear-gradient(
-                90deg,
-                rgba(33, 107, 255, 1) 0%,
-                rgba(102, 182, 255, 1) 100%
-              );
-              border: none;
-            }
-
-            .quxiao {
-              border: 1px solid rgba(43, 151, 252, 1);
-              color: rgba(43, 151, 252, 1);
-            }
-          }
-        }
-      }
-    }
-  }
 
 
   // 点击卡片弹窗
   // 点击卡片弹窗
   :deep(.projectCard) {
   :deep(.projectCard) {

+ 240 - 94
src/views/project/project.vue

@@ -281,6 +281,7 @@
             class="w-50 m-2"
             class="w-50 m-2"
             placeholder="请输入项目名称"
             placeholder="请输入项目名称"
             style="width: 160px"
             style="width: 160px"
+            @clear="searchBtn"
           />
           />
         </div>
         </div>
         <div class="fil">
         <div class="fil">
@@ -297,10 +298,16 @@
             "
             "
             >创建项目</el-button
             >创建项目</el-button
           >
           >
-          <el-button v-if="
+          <el-button
+            v-if="
               (activeName == 5 || activeName == 6) &&
               (activeName == 5 || activeName == 6) &&
               btnFlag('project-yijiancuiban')
               btnFlag('project-yijiancuiban')
-            " type="primary" class="search" @click="urgeProject">一键催办</el-button>
+            "
+            type="primary"
+            class="search"
+            @click="urgeProject"
+            >一键催办</el-button
+          >
           <!-- <el-button @click="searchBtn" color="rgba(33, 107, 255, 1)" plain
           <!-- <el-button @click="searchBtn" color="rgba(33, 107, 255, 1)" plain
             >批量导入</el-button
             >批量导入</el-button
           > -->
           > -->
@@ -416,13 +423,24 @@
               项目周期:{{ i.startTime }} ~ {{ i.endTime }}
               项目周期:{{ i.startTime }} ~ {{ i.endTime }}
             </div>
             </div>
             <!-- <div class="item">人员:{{ i.staffNum }}人</div> -->
             <!-- <div class="item">人员:{{ i.staffNum }}人</div> -->
-            <div class="item">任务:{{ i.taskNum }}个</div>
-            <div class="item">预警次数:{{ i.warnNum }}次</div>
-            <div class="item">提醒次数:{{ i.remindNum }}次</div>
+            <div>任务:{{ i.taskNum }}个</div>
+            <div
+              style="
+                display: flex;
+                align-items: center;
+                justify-content: space-between;
+              "
+            >
+              <div>
+                <div class="item">预警次数:{{ i.warnNum }}次</div>
+                <div class="item">提醒次数:{{ i.remindNum }}次</div>
+              </div>
+              <span class="score">{{ i.score }}<span style="font-size: 18px;">分</span></span>
+            </div>
             <div class="plan">
             <div class="plan">
               <span>项目进度:</span>
               <span>项目进度:</span>
               <el-progress
               <el-progress
-                :percentage="i.progress"
+                :percentage="i.progress*100"
                 color="rgba(0, 97, 255, 1)"
                 color="rgba(0, 97, 255, 1)"
               />
               />
               <img
               <img
@@ -753,7 +771,7 @@
           </div>
           </div>
           <div class="unit_i">
           <div class="unit_i">
             <span class="key">协办单位 :</span>
             <span class="key">协办单位 :</span>
-            <span class="value">{{ cardInfo.coOrganize }}</span>
+            <span class="value">{{ cardInfo.coOrganizeCopy }}</span>
           </div>
           </div>
           <div class="unit_i">
           <div class="unit_i">
             <span class="key">协办人 :</span>
             <span class="key">协办人 :</span>
@@ -821,11 +839,23 @@
             <el-table-column align="center" prop="taskName" label="任务名称" />
             <el-table-column align="center" prop="taskName" label="任务名称" />
             <el-table-column
             <el-table-column
               align="center"
               align="center"
-              prop="fileUrl"
-              width="120"
+              width="250"
               tooltip-effect
               tooltip-effect
               label="附件"
               label="附件"
-            />
+            >
+              <template #default="scope">
+                <div v-if="scope.row.fileUrl">
+                  <div v-for="i in scope.row.fileUrl.split(',')">
+                    <div
+                      style="color: rgba(33, 107, 255, 1); cursor: pointer"
+                      @click="pdfChange(i)"
+                    >
+                      {{ i }}
+                    </div>
+                  </div>
+                </div>
+              </template>
+            </el-table-column>
             <el-table-column align="center" label="状态">
             <el-table-column align="center" label="状态">
               <template #default="scope">
               <template #default="scope">
                 <span v-if="scope.row.state == 1">正常在办</span>
                 <span v-if="scope.row.state == 1">正常在办</span>
@@ -954,7 +984,7 @@
             v-if="activeName == 6 && isScorer()"
             v-if="activeName == 6 && isScorer()"
             type="primary"
             type="primary"
             class="search"
             class="search"
-            @click="scoreProject"
+            @click="scoreProjects"
             >评分</el-button
             >评分</el-button
           >
           >
         </div>
         </div>
@@ -971,19 +1001,28 @@
             }"
             }"
           >
           >
             <!-- <el-table-column type="selection" width="55" /> -->
             <!-- <el-table-column type="selection" width="55" /> -->
-            <el-table-column
-              align="center"
-              prop="createTime"
-              label="任务名称"
-            />
-            <el-table-column align="center" prop="createTime" label="附件" />
-            <el-table-column align="center" prop="createTime" label="内容" />
+            <el-table-column align="center" prop="taskName" label="任务名称" />
+            <el-table-column align="center" label="附件">
+              <template #default="scope">
+                <div v-if="scope.row.fileUrl">
+                  <div v-for="i in scope.row.fileUrl.split(',')">
+                    <div
+                      style="color: rgba(33, 107, 255, 1); cursor: pointer"
+                      @click="pdfChange(i)"
+                    >
+                      {{ i }}
+                    </div>
+                  </div>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column align="center" prop="content" label="内容" />
             <el-table-column
             <el-table-column
               align="center"
               align="center"
               prop="createTime"
               prop="createTime"
               label="发生时间"
               label="发生时间"
             />
             />
-            <el-table-column align="center" prop="createTime" label="操作人" />
+            <el-table-column align="center" prop="createBy" label="操作人" />
           </el-table>
           </el-table>
         </div>
         </div>
       </div>
       </div>
@@ -1069,6 +1108,12 @@
             placeholder="选择提醒时间"
             placeholder="选择提醒时间"
             format="YYYY-MM-DD HH:mm:ss"
             format="YYYY-MM-DD HH:mm:ss"
             value-format="YYYY-MM-DD HH:mm:ss"
             value-format="YYYY-MM-DD HH:mm:ss"
+            @update:modelValue="handleDateChange" 
+            :disabled-date="disabledDateFn"
+            :disabled-hours="disabledHours"
+            :disabled-minutes="disabledMinutes" 
+            :disabled-seconds="disabledSeconds"
+            :default-time="new Date()" 
           />
           />
         </el-form-item>
         </el-form-item>
         <el-form-item label="预警时间" prop="warnTime">
         <el-form-item label="预警时间" prop="warnTime">
@@ -1078,6 +1123,12 @@
             placeholder="选择预警时间"
             placeholder="选择预警时间"
             format="YYYY-MM-DD HH:mm:ss"
             format="YYYY-MM-DD HH:mm:ss"
             value-format="YYYY-MM-DD HH:mm:ss"
             value-format="YYYY-MM-DD HH:mm:ss"
+            @update:modelValue="handleDateChange"
+            :disabled-date="disabledDateFn"
+            :disabled-hours="disabledHours"
+            :disabled-minutes="disabledMinutes" 
+            :disabled-seconds="disabledSeconds"
+            :default-time="new Date()" 
           />
           />
         </el-form-item>
         </el-form-item>
         <el-form-item label="任务负责人" prop="header">
         <el-form-item label="任务负责人" prop="header">
@@ -1451,6 +1502,7 @@ const cardInfo = reactive({
   fileUrl: "", // 附件
   fileUrl: "", // 附件
   organize: "", // 主办单位
   organize: "", // 主办单位
   sposonerName: "", // 主办人
   sposonerName: "", // 主办人
+  coOrganizeCopy: "", // 协办单位去重展示用
   coOrganize: "", // 协办单位
   coOrganize: "", // 协办单位
   coSposonerName: "", // 协办人
   coSposonerName: "", // 协办人
   projectFrom: "", // 项目来源
   projectFrom: "", // 项目来源
@@ -1486,12 +1538,22 @@ const pdfFlag = ref(1); // word文档地址 1、pdf 2、word 3、图片
 const handleClick = (val) => {
 const handleClick = (val) => {
   // console.log(val);
   // console.log(val);
   activeName.value = val;
   activeName.value = val;
-  currentPage.value = 1;
-  totalPage.value = "";
-  tableData.list = [];
-  let filter = document.getElementById("filter");
-  filter.scrollTop = 0;
-  getList();
+  searchInput.projectName= null // 项目名称
+  searchInput.projectFrom= null // 项目来源
+  searchInput.projectLevel= null // 项目等级
+  searchInput.state= null //
+  searchInput.organize= null // 主办单位
+  searchInput.sposonerName= null // 主办人
+  searchInput.coOrganize= null // 协办单位
+  searchInput.coSposonerName= null // 协办人
+  searchInput.createTime= null // 创建时间
+  searchInput.periodTime= null // 周期时间
+  searchInput.finishTime= null // 完成时间
+  searchInput.scoreState= null // 是否已评分:1已评分,0未评分,null全部
+  searchInput.collect= null //    是否已关注,1收藏,0未收藏,null全部
+  searchInput.hasTask= null //       是否有任务:1有任务,0没有任务,null全部
+  searchInput.isScore= null //    是否我评分,1是我,0不是我,null全部
+  searchBtn()
 };
 };
 
 
 // 获取账户列表
 // 获取账户列表
@@ -1634,12 +1696,7 @@ const getUser1 = async (val) => {
     searchInput.organize = null;
     searchInput.organize = null;
     searchInput.sposonerName = null;
     searchInput.sposonerName = null;
   }
   }
-  currentPage.value = 1;
-  totalPage.value = "";
-  tableData.list = [];
-  let filter = document.getElementById("filter");
-  filter.scrollTop = 0;
-  getList();
+  searchBtn()
 };
 };
 // 搜索框协办单位  根据部门获取用户
 // 搜索框协办单位  根据部门获取用户
 const getUser2 = async (val) => {
 const getUser2 = async (val) => {
@@ -1651,12 +1708,7 @@ const getUser2 = async (val) => {
     searchInput.coOrganize = null;
     searchInput.coOrganize = null;
     searchInput.coSposonerName = null;
     searchInput.coSposonerName = null;
   }
   }
-  currentPage.value = 1;
-  totalPage.value = "";
-  tableData.list = [];
-  let filter = document.getElementById("filter");
-  filter.scrollTop = 0;
-  getList();
+  searchBtn()
 };
 };
 // // 搜索框主办单位  根据部门获取用户
 // // 搜索框主办单位  根据部门获取用户
 // const getUser1 = async (val) => {
 // const getUser1 = async (val) => {
@@ -1802,6 +1854,7 @@ const searchBtn = lodash.debounce(async () => {
 const projectCard = async (row) => {
 const projectCard = async (row) => {
   cardVisible.value = true;
   cardVisible.value = true;
   console.log(row);
   console.log(row);
+  
   cardTitle.value = row.projectName;
   cardTitle.value = row.projectName;
   fileList.value = row.fileUrl;
   fileList.value = row.fileUrl;
   cardInfo.projectName = row.projectName;
   cardInfo.projectName = row.projectName;
@@ -1810,7 +1863,22 @@ const projectCard = async (row) => {
   cardInfo.organize = row.organize;
   cardInfo.organize = row.organize;
   cardInfo.sposonerName = row.sposonerName;
   cardInfo.sposonerName = row.sposonerName;
   cardInfo.coSposonerName = row.coSposonerName;
   cardInfo.coSposonerName = row.coSposonerName;
+
+  // 协办单位去重展示用
+  let arrs=[]
+  console.log(row.coOrganize.split(','));
+  row.coOrganize.split(',').forEach(item=>{
+    let flag=arrs.some(i=>{
+      return i==item
+    })
+    if(!flag){
+      arrs.push(item)
+    }
+  })
+  cardInfo.coOrganizeCopy = arrs.join(',');
+
   cardInfo.coOrganize = row.coOrganize;
   cardInfo.coOrganize = row.coOrganize;
+  console.log(cardInfo.coOrganize);
   cardInfo.projectFrom = row.projectFrom;
   cardInfo.projectFrom = row.projectFrom;
   cardInfo.projectLevel = row.projectLevel;
   cardInfo.projectLevel = row.projectLevel;
   cardInfo.startTime = row.startTime;
   cardInfo.startTime = row.startTime;
@@ -1911,7 +1979,7 @@ const projectScroll = async (event) => {
     //   table.scrollTop = 0;
     //   table.scrollTop = 0;
     //   console.log("置顶到顶部");
     //   console.log("置顶到顶部");
     // }
     // }
-    console.log(table.scrollTop, "高度");
+    // console.log(table.scrollTop, "高度");
 
 
     let scrollTop = table.scrollTop;
     let scrollTop = table.scrollTop;
     let scrollHeight = table.scrollHeight;
     let scrollHeight = table.scrollHeight;
@@ -2276,50 +2344,47 @@ const urgeProject = async () => {
   })
   })
     .then(async () => {
     .then(async () => {
       let ids = [];
       let ids = [];
-  tableData.list.forEach((item) => {
-    ids.push(item.id);
-  });
-  let data = new FormData();
-  data.append("projectIds", ids);
-  if (ids.length) {
-    let res = await axios({
-      method: "post",
-      url: api.value + "/api/sysProject/urge",
-      headers: {
-        tokenP: sessionStorage.getItem("tokenP"),
-        user_head: sessionStorage.getItem("userhead"),
-      },
-      data: data,
-    });
-    if (res.data.code == 200) {
-      getList();
-      ElMessage({
-        type: "success",
-        showClose: true,
-        message: res.data.message,
-        center: true,
+      tableData.list.forEach((item) => {
+        ids.push(item.id);
       });
       });
-    } else {
-      ElMessage({
-        type: "error",
-        showClose: true,
-        message: res.data.message,
-        center: true,
-      });
-    }
-  } else {
-    ElMessage({
-      type: "warning",
-      showClose: true,
-      message: "暂无需要催办的项目",
-      center: true,
-    });
-  }
+      let data = new FormData();
+      data.append("projectIds", ids);
+      if (ids.length) {
+        let res = await axios({
+          method: "post",
+          url: api.value + "/api/sysProject/urge",
+          headers: {
+            tokenP: sessionStorage.getItem("tokenP"),
+            user_head: sessionStorage.getItem("userhead"),
+          },
+          data: data,
+        });
+        if (res.data.code == 200) {
+          getList();
+          ElMessage({
+            type: "success",
+            showClose: true,
+            message: res.data.message,
+            center: true,
+          });
+        } else {
+          ElMessage({
+            type: "error",
+            showClose: true,
+            message: res.data.message,
+            center: true,
+          });
+        }
+      } else {
+        ElMessage({
+          type: "warning",
+          showClose: true,
+          message: "暂无需要催办的项目",
+          center: true,
+        });
+      }
     })
     })
-    .catch(() => {
-      
-    });
- 
+    .catch(() => {});
 };
 };
 // 催办单个项目
 // 催办单个项目
 const urgeOneProject = async (row) => {
 const urgeOneProject = async (row) => {
@@ -2357,9 +2422,7 @@ const urgeOneProject = async (row) => {
         });
         });
       }
       }
     })
     })
-    .catch(() => {
-      
-    });
+    .catch(() => {});
 };
 };
 
 
 // 添加照片时往fileList列表中添加图片信息
 // 添加照片时往fileList列表中添加图片信息
@@ -2479,6 +2542,70 @@ const addTaskbtn = () => {
   taskRuleForm.periodTime = "";
   taskRuleForm.periodTime = "";
   taskRuleForm.id = "";
   taskRuleForm.id = "";
 };
 };
+
+// 任务预警和任务提醒时间限制
+const selectTimes = ref(Date.now());
+const handleDateChange = (value) => {
+  if (value && value.split(' ') && value.split(' ').length > 0) {
+    // 使用空格作为分隔符,将日期时间字符串拆分成数组
+    const parts = value.split(' ');
+    // 取数组的第一个元素(日期部分)
+    const datePart = parts[0];
+    // 将日期部分按照连字符 '-' 拆分成数组
+    const dateParts = datePart.split('-');
+    // 去除月份和日期中的前导零
+    const year = dateParts[0];
+    const month = parseInt(dateParts[1], 10); // 使用parseInt去除前导零
+    const day = parseInt(dateParts[2], 10); // 使用parseInt去除前导零
+ 
+    // 取数组的第二个元素(时间部分)
+    const timePart = parts[1];
+    // 将时间部分按照冒号 ':' 拆分成数组
+    const timeParts = timePart.split(':');
+    // 去除小时、分钟和秒中的前导零
+    const hour = parseInt(timeParts[0], 10); // 使用parseInt去除前导零
+    const minute = parseInt(timeParts[1], 10); // 使用parseInt去除前导零
+    const second = parseInt(timeParts[2], 10); // 使用parseInt去除前导零
+    // 实时保存选择时间
+    selectTimes.value = new Date(`${year}-${month}-${day} ${hour}:${minute}:${second}`).getTime();
+  }
+};
+// 禁用比当前时间小的日期
+const disabledDateFn = (time) => {
+  //比当前时间小的日期禁用(返回false则禁用)
+  return time.getTime() < Date.now() - 24 * 3600 * 1000;
+};
+// 限制比当前时间小的小时
+const disabledHours = () => {
+  const a = [];
+  if (new Date(selectTimes.value).getTime() > Date.now()) return a;
+  for (let i = 0; i < 24; i++) {
+    if (new Date().getHours() <= i) continue;
+    a.push(i);
+  }
+  return a;
+};
+// 禁用比当前时间小的分钟
+const disabledMinutes = () => {
+  const a = [];
+  if (new Date(selectTimes.value).getTime() > Date.now()) return a;
+  for (let i = 0; i < 60; i++) {
+    if (new Date().getMinutes() <= i) continue;
+    a.push(i);
+  }
+  return a;
+};
+// 禁用比当前时间小的秒
+const disabledSeconds = () => {
+  const a = [];
+  if (new Date(selectTimes.value).getTime() > Date.now()) return a;
+  for (let i = 0; i < 60; i++) {
+    if (new Date().getSeconds() <= i) continue;
+    a.push(i);
+  }
+  return a;
+};
+
 // 确定任务
 // 确定任务
 const confirmTask = (formEl) => {
 const confirmTask = (formEl) => {
   if (!formEl) return;
   if (!formEl) return;
@@ -2700,13 +2827,16 @@ const scoreProject = (row) => {
   scoreVisible.value = true;
   scoreVisible.value = true;
   scoreRuleForm.describe = "";
   scoreRuleForm.describe = "";
   scoreRuleForm.num = "";
   scoreRuleForm.num = "";
-  if (row) {
-    taskRuleForm.projectId = row.id;
-  }
+  taskRuleForm.projectId = row.id;
 };
 };
+const scoreProjects=()=>{
+  scoreVisible.value = true;
+  scoreRuleForm.describe = "";
+  scoreRuleForm.num = "";
+}
 // 判断当前分管领导是否在评分人中
 // 判断当前分管领导是否在评分人中
 const isScorer = (row) => {
 const isScorer = (row) => {
-  console.log(row);
+  // console.log(row);
   if (row) {
   if (row) {
     let userId = sessionStorage.getItem("id");
     let userId = sessionStorage.getItem("id");
     let flag = row.scorer.split(",").some((i) => {
     let flag = row.scorer.split(",").some((i) => {
@@ -2730,6 +2860,8 @@ const confirmScore = (formEl) => {
       data.append("projectId", taskRuleForm.projectId);
       data.append("projectId", taskRuleForm.projectId);
       data.append("evaluate", scoreRuleForm.describe);
       data.append("evaluate", scoreRuleForm.describe);
       data.append("score", scoreRuleForm.num);
       data.append("score", scoreRuleForm.num);
+      console.log(taskRuleForm.projectId);
+      
       let res = await axios({
       let res = await axios({
         method: "post",
         method: "post",
         url: api.value + "/api/sysProject/evaluate",
         url: api.value + "/api/sysProject/evaluate",
@@ -2740,8 +2872,15 @@ const confirmScore = (formEl) => {
         data: data,
         data: data,
       });
       });
       if (res.data.code == 200) {
       if (res.data.code == 200) {
-        console.log(res, "任务日志");
-        logData.value = res.data.data;
+        taskList()
+        getList()
+        scoreVisible.value = false;
+        ElMessage({
+          type: "success",
+          showClose: true,
+          message: res.data.message,
+          center: true,
+        });
       } else {
       } else {
         ElMessage({
         ElMessage({
           type: "error",
           type: "error",
@@ -2788,6 +2927,7 @@ const confirmUpdate = (formEl) => {
       if (res.data.code == 200) {
       if (res.data.code == 200) {
         taskList();
         taskList();
         getList();
         getList();
+        updateVisible.value = false;
         ElMessage({
         ElMessage({
           type: "success",
           type: "success",
           showClose: true,
           showClose: true,
@@ -2894,7 +3034,7 @@ const filePreviewPdf = (url) => {
     ElMessage({
     ElMessage({
       type: "warning",
       type: "warning",
       showClose: true,
       showClose: true,
-      message: "未上传施工许可证文件",
+      message: "未上传文件",
       center: true,
       center: true,
     });
     });
   }
   }
@@ -3008,7 +3148,7 @@ onMounted(() => {
 
 
   .filter {
   .filter {
     width: calc(100% - 60px);
     width: calc(100% - 60px);
-    margin: 0 auto;
+    margin: 0 auto 20px;
     flex: 1;
     flex: 1;
     overflow: auto;
     overflow: auto;
     // 整个滚动条
     // 整个滚动条
@@ -3050,7 +3190,7 @@ onMounted(() => {
 
 
       .el-card {
       .el-card {
         width: 370px;
         width: 370px;
-        height: 229px;
+        height: 235px;
         margin: 0 20px 20px 0;
         margin: 0 20px 20px 0;
         opacity: 1;
         opacity: 1;
         border-radius: 4px;
         border-radius: 4px;
@@ -3134,7 +3274,7 @@ onMounted(() => {
 
 
           .plan {
           .plan {
             display: flex;
             display: flex;
-
+            align-items: center;
             :deep(.el-progress-bar) {
             :deep(.el-progress-bar) {
               width: 180px;
               width: 180px;
             }
             }
@@ -3143,9 +3283,14 @@ onMounted(() => {
               width: 20px;
               width: 20px;
               height: 20px;
               height: 20px;
               cursor: pointer;
               cursor: pointer;
-              transform: translateY(-3px);
+              transform: translateY(-2px);
             }
             }
           }
           }
+
+          .score {
+            color: blueviolet;
+            font-size: 18px;
+          }
         }
         }
       }
       }
     }
     }
@@ -3306,6 +3451,7 @@ onMounted(() => {
 
 
           .attachment {
           .attachment {
             color: rgba(33, 107, 255, 1);
             color: rgba(33, 107, 255, 1);
+            cursor: pointer;
           }
           }
         }
         }
       }
       }

+ 1 - 1
src/views/system/system.vue

@@ -43,7 +43,7 @@
           <!-- <el-table-column type="selection" width="55" /> -->
           <!-- <el-table-column type="selection" width="55" /> -->
           <el-table-column align="center" prop="configKey" label="维度名称" />
           <el-table-column align="center" prop="configKey" label="维度名称" />
           <el-table-column align="center" prop="configValue" label="维度权重" />
           <el-table-column align="center" prop="configValue" label="维度权重" />
-          <el-table-column align="center" prop="createBy" label="创建人" />
+          <!-- <el-table-column align="center" prop="createBy" label="创建人" /> -->
           <el-table-column align="center" label="操作" width="220">
           <el-table-column align="center" label="操作" width="220">
             <template #default="scope">
             <template #default="scope">
               <div class="options">
               <div class="options">

+ 134 - 15
src/views/user/user.vue

@@ -95,7 +95,10 @@
       </div>
       </div>
       <!-- 按钮列表 -->
       <!-- 按钮列表 -->
       <div class="gongneng">
       <div class="gongneng">
-        <el-button v-if="btnFlag('user-tianjiayonghu')" @click="addProjectbtn" class="add"
+        <el-button
+          v-if="btnFlag('user-tianjiayonghu')"
+          @click="addProjectbtn"
+          class="add"
           ><el-icon> <CirclePlus /> </el-icon><span>创建用户</span></el-button
           ><el-icon> <CirclePlus /> </el-icon><span>创建用户</span></el-button
         >
         >
         <!-- <el-button @click="projectImportBtn" class="imp"
         <!-- <el-button @click="projectImportBtn" class="imp"
@@ -139,19 +142,69 @@
           />
           />
           <el-table-column
           <el-table-column
             align="center"
             align="center"
-            prop="manageDepartment"
             label="分管部门"
             label="分管部门"
+            prop="manageDepartment"
             width="300"
             width="300"
             tooltip-effect
             tooltip-effect
-          />
+          >
+            <template #default="scope">
+              <div v-if="scope.row.manageDepartment">
+                <el-tag style="margin-right: 10px" type="primary">{{
+                  scope.row.manageDepartmentTag1
+                }}</el-tag>
+                <el-tooltip
+                  class="box-item"
+                  effect="light"
+                  v-if="scope.row.manageDepartmentTagNum >= 1"
+                >
+                  <template #content>
+                    <div style="display: flex;justify-content:flex-start;flex-wrap: wrap;">
+                      <el-tag
+                      style="margin: 3px 3px"
+                      
+                      type="primary"
+                      v-for="item in scope.row.manageDepartmentTag2"
+                      >{{ item }}</el-tag
+                    >
+                    </div>
+                    
+                  </template>
+                  <el-tag type="primary"
+                    >+{{ scope.row.manageDepartmentTagNum }}</el-tag
+                  >
+                </el-tooltip>
+                <!-- <el-select
+                  v-model="scope.row.manageDepartmentArr"
+                  placeholder="请选择"
+                  style="width: 220px"
+                  collapse-tags
+                  multiple
+                  collapse-tags-tooltip
+                >
+                  <el-option
+                    v-for="item in scope.row.manageDepartmentList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.name"
+                  />
+                </el-select> -->
+              </div>
+            </template>
+          </el-table-column>
           <el-table-column align="center" prop="mobile" label="手机号码" />
           <el-table-column align="center" prop="mobile" label="手机号码" />
           <el-table-column align="center" prop="createTime" label="创建时间" />
           <el-table-column align="center" prop="createTime" label="创建时间" />
           <el-table-column align="center" label="操作" width="220">
           <el-table-column align="center" label="操作" width="220">
             <template #default="scope">
             <template #default="scope">
               <div class="options">
               <div class="options">
-                <div class="look" v-if="btnFlag('user-xiugaiyonghu')" @click="edit(scope.row)">编辑</div>
+                <div
+                  class="look"
+                  v-if="btnFlag('user-xiugaiyonghu')"
+                  @click="edit(scope.row)"
+                >
+                  编辑
+                </div>
                 <el-popconfirm
                 <el-popconfirm
-                v-if="btnFlag('user-shanchuyonghu')"
+                  v-if="btnFlag('user-shanchuyonghu')"
                   width="200"
                   width="200"
                   confirm-button-text="确认"
                   confirm-button-text="确认"
                   cancel-button-text="取消"
                   cancel-button-text="取消"
@@ -262,7 +315,18 @@
                 collapse-tags
                 collapse-tags
                 multiple
                 multiple
                 clearable
                 clearable
-              >
+                collapse-tags-tooltip
+                popper-class="custom-header"
+                :max-collapse-tags="1"
+                ><template #header>
+                  <el-checkbox
+                    v-model="checkAll"
+                    :indeterminate="indeterminate"
+                    @change="handleCheckAll"
+                  >
+                    全选
+                  </el-checkbox>
+                </template>
                 <el-option
                 <el-option
                   v-for="item in departmentData"
                   v-for="item in departmentData"
                   :key="item.id"
                   :key="item.id"
@@ -359,7 +423,7 @@ import {
   watch,
   watch,
   onBeforeMount,
   onBeforeMount,
   onUnmounted,
   onUnmounted,
-  inject
+  inject,
 } from "vue";
 } from "vue";
 import COS from "cos-js-sdk-v5";
 import COS from "cos-js-sdk-v5";
 import { useRouter } from "vue-router";
 import { useRouter } from "vue-router";
@@ -372,7 +436,7 @@ import { useStore } from "vuex";
 
 
 const store = useStore();
 const store = useStore();
 const router = useRouter();
 const router = useRouter();
-const btnFlag = inject('$btnFlag')
+const btnFlag = inject("$btnFlag");
 
 
 const loading = ref(false);
 const loading = ref(false);
 const tableData = reactive({
 const tableData = reactive({
@@ -403,14 +467,18 @@ const accountVisible = ref(false);
 const accountTitle = ref();
 const accountTitle = ref();
 const accountRef = ref();
 const accountRef = ref();
 
 
+// 分管部门全选
+const checkAll = ref(false);
+const indeterminate = ref(false);
+
 const accountRuleForm = reactive({
 const accountRuleForm = reactive({
   userName: "", // 姓名
   userName: "", // 姓名
   userCode: "", //正方工号
   userCode: "", //正方工号
   cardNumber: "", // 微校卡号
   cardNumber: "", // 微校卡号
   roleId: "", // 角色
   roleId: "", // 角色
   mobile: "", // 联系电话
   mobile: "", // 联系电话
-  manageDepartment: "", // 分管部门
   department: "", // 所属部门
   department: "", // 所属部门
+  manageDepartment: "", // 分管部门
   id: "",
   id: "",
 });
 });
 // 新增账号表单验证
 // 新增账号表单验证
@@ -464,11 +532,35 @@ const getList = async () => {
   });
   });
   console.log(res, "用户管理数据");
   console.log(res, "用户管理数据");
   if (res.data.code == 200) {
   if (res.data.code == 200) {
+    res.data.data.rows.forEach((i) => {
+      if (i.manageDepartment) {
+        // i.manageDepartmentArr = i.manageDepartment.split(",");
+        let arr = i.manageDepartment.split(",");
+        if (i.manageDepartment.split(",").length > 1) {
+          i.manageDepartmentTag1 = arr[0];
+          i.manageDepartmentTag2 = arr.filter((val, ind) => {
+            return ind != 0;
+          });
+          i.manageDepartmentTagNum = arr.length - 1;
+        } else if (i.manageDepartment.split(",").length == 1) {
+          i.manageDepartmentTag1 = arr[0];
+          i.manageDepartmentTag2 = [];
+          i.manageDepartmentTagNum = 0;
+        } else {
+          i.manageDepartmentTag1 = "";
+          i.manageDepartmentTag2 = [];
+          i.manageDepartmentTagNum = 0;
+        }
+      }
+      // i.manageDepartmentList = arr;
+    });
     tableData.list = res.data.data.rows;
     tableData.list = res.data.data.rows;
+    console.log(tableData.list, "整合数据");
     total.value = res.data.data.total;
     total.value = res.data.data.total;
     loading.value = false;
     loading.value = false;
   } else {
   } else {
-    window.location.href = 'https://chtech.ncjti.edu.cn/kpi/template/api/sysUser/authorize';
+    window.location.href =
+      "https://chtech.ncjti.edu.cn/kpi/template/api/sysUser/authorize";
     loading.value = false;
     loading.value = false;
     ElMessage({
     ElMessage({
       type: "error",
       type: "error",
@@ -571,10 +663,34 @@ const addProjectbtn = () => {
   accountRuleForm.cardNumber = "";
   accountRuleForm.cardNumber = "";
   accountRuleForm.roleId = "";
   accountRuleForm.roleId = "";
   accountRuleForm.mobile = "";
   accountRuleForm.mobile = "";
-  accountRuleForm.manageDepartment = "";
+  accountRuleForm.manageDepartment = [];
   accountRuleForm.department = "";
   accountRuleForm.department = "";
   accountRuleForm.id = "";
   accountRuleForm.id = "";
 };
 };
+watch(
+  () => accountRuleForm.manageDepartment,
+  (val) => {
+    // console.log(val);
+    if (val.length === 0) {
+      checkAll.value = false;
+      indeterminate.value = false;
+    } else if (val.length === departmentData.value.length) {
+      checkAll.value = true;
+      indeterminate.value = false;
+    } else {
+      indeterminate.value = true;
+    }
+  }
+);
+
+const handleCheckAll = (val) => {
+  indeterminate.value = false;
+  if (val) {
+    accountRuleForm.manageDepartment = departmentData.value.map((_) => _.oname);
+  } else {
+    accountRuleForm.manageDepartment = [];
+  }
+};
 // 取消角色新增
 // 取消角色新增
 const cancelAccount = () => {
 const cancelAccount = () => {
   accountRef.value.resetFields();
   accountRef.value.resetFields();
@@ -599,7 +715,9 @@ const confirmAccount = (formEl) => {
         userCode: accountRuleForm.userCode,
         userCode: accountRuleForm.userCode,
         cardNumber: accountRuleForm.cardNumber,
         cardNumber: accountRuleForm.cardNumber,
         roleId: accountRuleForm.roleId,
         roleId: accountRuleForm.roleId,
-        manageDepartment: accountRuleForm.manageDepartment?accountRuleForm.manageDepartment.join(","):null,
+        manageDepartment: accountRuleForm.manageDepartment
+          ? accountRuleForm.manageDepartment.join(",")
+          : null,
         department: accountRuleForm.department,
         department: accountRuleForm.department,
         mobile: accountRuleForm.mobile,
         mobile: accountRuleForm.mobile,
       };
       };
@@ -631,6 +749,7 @@ const confirmAccount = (formEl) => {
       if (res.data.code == 200) {
       if (res.data.code == 200) {
         accountVisible.value = false;
         accountVisible.value = false;
         getList();
         getList();
+        accountRuleForm.manageDepartment = [];
         accountRef.value.resetFields();
         accountRef.value.resetFields();
         ElMessage({
         ElMessage({
           type: "success",
           type: "success",
@@ -658,10 +777,10 @@ const edit = (row) => {
   accountRuleForm.cardNumber = row.cardNumber;
   accountRuleForm.cardNumber = row.cardNumber;
   accountRuleForm.roleId = row.roleId;
   accountRuleForm.roleId = row.roleId;
   accountRuleForm.mobile = row.mobile;
   accountRuleForm.mobile = row.mobile;
-  if(row.manageDepartment){
+  if (row.manageDepartment) {
     accountRuleForm.manageDepartment = row.manageDepartment.split(",");
     accountRuleForm.manageDepartment = row.manageDepartment.split(",");
-  }else{
-    row.manageDepartment=null
+  } else {
+    row.manageDepartment = null;
   }
   }
   accountRuleForm.department = row.department;
   accountRuleForm.department = row.department;
   accountRuleForm.id = row.id;
   accountRuleForm.id = row.id;

+ 279 - 0
viewer.properties

@@ -0,0 +1,279 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=上一页
+previous_label=上一页
+next.title=下一页
+next_label=下一页
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=页面
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=/ {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} / {{pagesCount}})
+
+zoom_out.title=缩小
+zoom_out_label=缩小
+zoom_in.title=放大
+zoom_in_label=放大
+zoom.title=缩放
+presentation_mode.title=切换到演示模式
+presentation_mode_label=演示模式
+open_file.title=打开文件
+open_file_label=打开
+print.title=打印
+print_label=打印
+download.title=下载
+download_label=下载
+bookmark.title=当前在看的内容(复制或在新窗口中打开)
+bookmark_label=当前在看
+
+save.title=保存
+save_label=保存
+bookmark1.title=当前页面(在当前页面查看 URL)
+bookmark1_label=当前页面
+
+# Secondary toolbar and context menu
+tools.title=工具
+tools_label=工具
+first_page.title=转到第一页
+first_page_label=转到第一页
+last_page.title=转到最后一页
+last_page_label=转到最后一页
+page_rotate_cw.title=顺时针旋转
+page_rotate_cw_label=顺时针旋转
+page_rotate_ccw.title=逆时针旋转
+page_rotate_ccw_label=逆时针旋转
+
+cursor_text_select_tool.title=启用文本选择工具
+cursor_text_select_tool_label=文本选择工具
+cursor_hand_tool.title=启用手形工具
+cursor_hand_tool_label=手形工具
+
+scroll_page.title=使用页面滚动
+scroll_page_label=页面滚动
+scroll_vertical.title=使用垂直滚动
+scroll_vertical_label=垂直滚动
+scroll_horizontal.title=使用水平滚动
+scroll_horizontal_label=水平滚动
+scroll_wrapped.title=使用平铺滚动
+scroll_wrapped_label=平铺滚动
+
+spread_none.title=不加入衔接页
+spread_none_label=单页视图
+spread_odd.title=加入衔接页使奇数页作为起始页
+spread_odd_label=双页视图
+spread_even.title=加入衔接页使偶数页作为起始页
+spread_even_label=书籍视图
+
+# Document properties dialog box
+document_properties.title=文档属性…
+document_properties_label=文档属性…
+document_properties_file_name=文件名:
+document_properties_file_size=文件大小:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} 字节)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} 字节)
+document_properties_title=标题:
+document_properties_author=作者:
+document_properties_subject=主题:
+document_properties_keywords=关键词:
+document_properties_creation_date=创建日期:
+document_properties_modification_date=修改日期:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=创建者:
+document_properties_producer=PDF 生成器:
+document_properties_version=PDF 版本:
+document_properties_page_count=页数:
+document_properties_page_size=页面大小:
+document_properties_page_size_unit_inches=英寸
+document_properties_page_size_unit_millimeters=毫米
+document_properties_page_size_orientation_portrait=纵向
+document_properties_page_size_orientation_landscape=横向
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=文本
+document_properties_page_size_name_legal=法律
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}}({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}}({{name}},{{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=快速 Web 视图:
+document_properties_linearized_yes=是
+document_properties_linearized_no=否
+document_properties_close=关闭
+
+print_progress_message=正在准备打印文档…
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=取消
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=切换侧栏
+toggle_sidebar_notification2.title=切换侧栏(文档所含的大纲/附件/图层)
+toggle_sidebar_label=切换侧栏
+document_outline.title=显示文档大纲(双击展开/折叠所有项)
+document_outline_label=文档大纲
+attachments.title=显示附件
+attachments_label=附件
+layers.title=显示图层(双击即可将所有图层重置为默认状态)
+layers_label=图层
+thumbs.title=显示缩略图
+thumbs_label=缩略图
+current_outline_item.title=查找当前大纲项目
+current_outline_item_label=当前大纲项目
+findbar.title=在文档中查找
+findbar_label=查找
+
+additional_layers=其他图层
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=第 {{page}} 页
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=第 {{page}} 页
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=页面 {{page}} 的缩略图
+
+# Find panel button title and messages
+find_input.title=查找
+find_input.placeholder=在文档中查找…
+find_previous.title=查找词语上一次出现的位置
+find_previous_label=上一页
+find_next.title=查找词语后一次出现的位置
+find_next_label=下一页
+find_highlight=全部高亮显示
+find_match_case_label=区分大小写
+find_match_diacritics_label=匹配变音符号
+find_entire_word_label=全词匹配
+find_reached_top=到达文档开头,从末尾继续
+find_reached_bottom=到达文档末尾,从开头继续
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]=第 {{current}} 项,共匹配 {{total}} 项
+find_match_count[two]=第 {{current}} 项,共匹配 {{total}} 项
+find_match_count[few]=第 {{current}} 项,共匹配 {{total}} 项
+find_match_count[many]=第 {{current}} 项,共匹配 {{total}} 项
+find_match_count[other]=第 {{current}} 项,共匹配 {{total}} 项
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=超过 {{limit}} 项匹配
+find_match_count_limit[one]=超过 {{limit}} 项匹配
+find_match_count_limit[two]=超过 {{limit}} 项匹配
+find_match_count_limit[few]=超过 {{limit}} 项匹配
+find_match_count_limit[many]=超过 {{limit}} 项匹配
+find_match_count_limit[other]=超过 {{limit}} 项匹配
+find_not_found=找不到指定词语
+
+# Error panel labels
+error_more_info=更多信息
+error_less_info=更少信息
+error_close=关闭
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=信息:{{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=堆栈:{{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=文件:{{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=行号:{{line}}
+
+# Predefined zoom values
+page_scale_width=适合页宽
+page_scale_fit=适合页面
+page_scale_auto=自动缩放
+page_scale_actual=实际大小
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading=正在加载…
+
+# Loading indicator messages
+loading_error=加载 PDF 时发生错误。
+invalid_file_error=无效或损坏的 PDF 文件。
+missing_file_error=缺少 PDF 文件。
+unexpected_response_error=意外的服务器响应。
+
+rendering_error=渲染页面时发生错误。
+
+# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be
+# replaced by the modification date, and time, of the annotation.
+annotation_date_string={{date}},{{time}}
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} 注释]
+password_label=输入密码以打开此 PDF 文件。
+password_invalid=密码无效。请重试。
+password_ok=确定
+password_cancel=取消
+
+printing_not_supported=警告:此浏览器尚未完整支持打印功能。
+printing_not_ready=警告:此 PDF 未完成加载,无法打印。
+web_fonts_disabled=Web 字体已被禁用:无法使用嵌入的 PDF 字体。
+
+# Editor
+editor_free_text2.title=文本
+editor_free_text2_label=文本
+editor_ink2.title=绘图
+editor_ink2_label=绘图
+
+free_text2_default_content=开始输入…
+
+# Editor Parameters
+editor_free_text_color=颜色
+editor_free_text_size=字号
+editor_ink_color=颜色
+editor_ink_thickness=粗细
+editor_ink_opacity=不透明度
+
+# Editor aria
+editor_free_text2_aria_label=文本编辑器
+editor_ink2_aria_label=绘图编辑器
+editor_ink_canvas_aria_label=用户创建图像