cb_luzhixia 1 månad sedan
förälder
incheckning
4299f8aac6

+ 17 - 2
src/api/memoManage.js

@@ -31,8 +31,23 @@ export function addMemo(params) {
 // 更新备忘录
 export function updateMemo(params) {
   return request({
-    url: `${url}/api/costProjectMemo/v1/update`,
-    method: 'post',
+    url: `${url}/api/costProjectMemo/v1/`,
+    method: 'put',
+    data: params,
+  })
+}
+
+export function deleteMemo(id) {
+  return request({
+    url: `${url}/api/costProjectMemo/v1/${id}`,
+    method: 'delete',
+  })
+}
+// /api/costProjectMemo/v1/
+export function deleteMemoBatch(params) {
+  return request({
+    url: `${url}/api/costProjectMemo/v1/`,
+    method: 'delete',
     data: params,
   })
 }

+ 9 - 0
src/api/uc.js

@@ -107,3 +107,12 @@ export function getAllUserList() {
     method: 'get',
   })
 }
+
+// 获取企业单位用户
+export function getOrgUserQuery(params) {
+  return request({
+    url: `${uc}/api/user/v1/users/getOrgUserQuery`,
+    method: 'post',
+    data: params,
+  })
+}

+ 213 - 28
src/components/costAudit/AuditEntityFormtDialog.vue

@@ -13,7 +13,6 @@
       @close="handleCancel"
     >
       <div class="formtDialog-content">
-        <!-- 使用Element表单直接实现 -->
         <el-form
           ref="formRef"
           :model="formData"
@@ -32,7 +31,8 @@
                 />
               </el-form-item>
             </el-col>
-
+          </el-row>
+          <el-row :gutter="20">
             <!-- 社会信用代码 和 所属区域 -->
             <el-col :span="12">
               <el-form-item label="社会信用代码:" prop="socialCreditCode">
@@ -56,7 +56,8 @@
                 />
               </el-form-item>
             </el-col>
-
+          </el-row>
+          <el-row :gutter="20">
             <!-- 办公地址 -->
             <el-col :span="24">
               <el-form-item label="办公地址:" prop="address">
@@ -67,7 +68,8 @@
                 />
               </el-form-item>
             </el-col>
-
+          </el-row>
+          <el-row :gutter="20">
             <!-- 主体性质 和 关联子单位 -->
             <el-col :span="12">
               <el-form-item label="主体性质:" prop="entityType">
@@ -104,7 +106,8 @@
                 </el-select>
               </el-form-item>
             </el-col>
-
+          </el-row>
+          <el-row :gutter="20">
             <!-- 关联监审项目 -->
             <el-col :span="24">
               <el-form-item label="关联监审项目:" prop="relatedItems">
@@ -118,8 +121,9 @@
                 />
               </el-form-item>
             </el-col>
-
-            <!-- 联系人 和 联系手机 -->
+          </el-row>
+          <!-- 联系人 和 联系手机 -->
+          <el-row :gutter="20">
             <el-col :span="12">
               <el-form-item label="联系人:" prop="contactName">
                 <el-input
@@ -138,8 +142,10 @@
                 />
               </el-form-item>
             </el-col>
+          </el-row>
 
-            <!-- 电子邮箱 和 邮政编码 -->
+          <!-- 电子邮箱 和 邮政编码 -->
+          <el-row :gutter="20">
             <el-col :span="12">
               <el-form-item label="电子邮箱:" prop="email">
                 <el-input
@@ -158,16 +164,17 @@
                 />
               </el-form-item>
             </el-col>
+          </el-row>
 
-            <!-- 账号 和 状态 -->
+          <!-- 账号 和 状态 -->
+          <el-row :gutter="20">
             <el-col :span="12">
               <el-form-item label="账号:" prop="account">
                 <el-select
                   v-model="formData.account"
                   placeholder="请选择账号"
-                  style="width: 100%"
-                  :disabled="isViewMode"
-                  @change="handleAccountChange"
+                  style="width: 70%"
+                  :disabled="true"
                 >
                   <el-option
                     v-for="(item, index) in userList"
@@ -176,6 +183,14 @@
                     :value="item.userId"
                   ></el-option>
                 </el-select>
+                <el-button
+                  v-if="!isViewMode"
+                  type="primary"
+                  size="mini"
+                  @click="handleEditUser"
+                >
+                  选择账号
+                </el-button>
               </el-form-item>
             </el-col>
             <el-col :span="12">
@@ -198,6 +213,49 @@
         </el-form>
       </div>
     </CostAuditDialog>
+
+    <!-- 账号选择弹窗 -->
+    <el-dialog
+      :visible.sync="userSelectDialogVisible"
+      title="选择账号"
+      width="50%"
+      :close-on-click-modal="false"
+    >
+      <el-table
+        ref="userTable"
+        :data="userTableData"
+        :loading="userTableLoading"
+        style="width: 100%"
+        border
+        @selection-change="handleUserSelectionChange"
+      >
+        <el-table-column type="selection" width="55" />
+        <el-table-column prop="fullname" label="姓名" align="center" />
+        <el-table-column prop="account" label="账号" align="center" />
+        <el-table-column prop="email" label="邮箱" align="center" />
+        <el-table-column prop="mobile" label="手机" align="center" />
+        <el-table-column prop="sex" label="性别" align="center" />
+        <el-table-column
+          prop="status"
+          label="状态"
+          :formatter="formatStatus"
+          align="center"
+        />
+      </el-table>
+      <el-pagination
+        class="mt20"
+        :current-page.sync="userPagination.pageNum"
+        :page-size="userPagination.pageSize"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="userPagination.total"
+        @current-change="handleUserCurrentChange"
+        @size-change="handleUserSizeChange"
+      ></el-pagination>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="confirmSelectUser">确认</el-button>
+        <el-button @click="cancelSelectUser">取消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 <script>
@@ -213,7 +271,7 @@
   import { regionMixin, catalogMixin, commonMixin } from '@/mixins/useDict'
   // 引入弹窗组件
   import CostAuditDialog from '@/components/costAudit/CostAuditDialog'
-  import { getAllUserList } from '@/api/uc'
+  import { getAllUserList, getOrgUserQuery } from '@/api/uc'
   export default {
     name: 'AuditEntityFormtDialog',
     // 注册组件
@@ -237,7 +295,7 @@
       // 弹窗宽度
       dialogWidth: {
         type: String,
-        default: '50%',
+        default: '55%',
       },
       // 单位ID(编辑/查看模式下使用)
       unitId: {
@@ -285,6 +343,20 @@
             value: 0,
           },
         ],
+        // 账号选择弹窗
+        userSelectDialogVisible: false,
+        // 账号选择表格数据
+        userTableData: [],
+        // 账号选择表格加载状态
+        userTableLoading: false,
+        // 账号选择表格分页
+        userPagination: {
+          pageNum: 1,
+          pageSize: 50,
+          total: 0,
+        },
+        // 选中的用户
+        selectedUser: null,
         // 表单数据
         formData: {
           unitId: '', // 单位ID
@@ -383,8 +455,8 @@
             { required: true, message: '请输入联系人', trigger: 'blur' },
             {
               min: 1,
-              max: 50,
-              message: '联系人长度应在1-50个字符之间',
+              max: 30,
+              message: '联系人长度应在30个字符之间',
               trigger: 'blur',
             },
             {
@@ -406,8 +478,8 @@
             { type: 'email', message: '请输入正确的邮箱地址', trigger: 'blur' },
             {
               min: 1,
-              max: 100,
-              message: '邮箱长度应在1-100个字符之间',
+              max: 30,
+              message: '邮箱长度应在30个字符之间',
               trigger: 'blur',
             },
           ],
@@ -532,18 +604,130 @@
           }
         })
       },
-      // 处理账号变更
-      handleAccountChange(val) {
-        if (val) {
-          // 根据选择的账号自动填充密码
-          const selectedAccount = this.userList.find(
-            (item) => item.userId === val
-          )
-          if (selectedAccount) {
-            this.$set(this.formData, 'password', selectedAccount.password)
+      // 处理账号选择
+      handleEditUser() {
+        this.userSelectDialogVisible = true
+        // 加载用户列表并在加载完成后处理默认选中
+        this.$nextTick(() => {
+          this.loadUserList().then(() => {
+            // 如果表单中已有账号信息,自动选中对应的用户
+            if (this.formData.account && this.userTableData.length > 0) {
+              // 在用户列表中查找对应的用户
+              const userToSelect = this.userTableData.find(
+                (user) =>
+                  user.userId === this.formData.account ||
+                  user.account === this.formData.account
+              )
+              if (userToSelect && this.$refs.userTable) {
+                // 在下一个渲染周期中执行选中操作
+                this.$nextTick(() => {
+                  this.$refs.userTable.clearSelection()
+                  this.$refs.userTable.toggleRowSelection(userToSelect, true)
+                  this.selectedUser = userToSelect
+                })
+              }
+            }
+          })
+        })
+      },
+
+      // 加载用户列表
+      async loadUserList() {
+        this.userTableLoading = true
+        try {
+          const params = {
+            pageBean: {
+              pageNum: this.userPagination.pageNum,
+              pageSize: this.userPagination.pageSize,
+              total: this.userPagination.total,
+            },
+            sorter: [
+              {
+                direction: 'DESC',
+                property: 'updateTime',
+              },
+            ],
+            querys: [
+              {
+                property: 'ORG_ID_',
+                value: '1930078047826903040',
+                group: 'orgTree',
+                relation: 'AND',
+                operation: 'IN',
+              },
+            ],
           }
+          const res = await getOrgUserQuery(params)
+          if (res.rows) {
+            this.userTableData = res.rows || []
+            this.userPagination.total = res.total || 0
+          }
+          // 返回Promise以支持链式调用
+          return Promise.resolve()
+        } catch (error) {
+          console.error('加载用户列表失败:', error)
+          // 返回rejected状态的Promise
+          return Promise.reject(error)
+        } finally {
+          this.userTableLoading = false
         }
       },
+
+      handleUserCurrentChange(current) {
+        this.userPagination.pageNum = current
+        this.loadUserList()
+      },
+      handleUserSizeChange(size) {
+        this.userPagination.pageSize = size
+        this.loadUserList()
+      },
+      // 处理用户选择
+      handleUserSelectionChange(selection) {
+        // 简化的单选逻辑,确保能够正确选中
+        if (selection.length > 1) {
+          // 获取最后一个选中的用户
+          const selected = selection[selection.length - 1]
+
+          // 在下一个渲染周期中更新选中状态,确保DOM已更新
+          this.$nextTick(() => {
+            // 清除所有选中项
+            this.$refs.userTable.clearSelection()
+            // 手动选中当前项
+            this.$refs.userTable.toggleRowSelection(selected, true)
+          })
+
+          // 更新选中用户
+          this.selectedUser = selected
+        } else if (selection.length == 1) {
+          // 取消选择时清空
+          this.selectedUser = selection[0]
+        }
+      },
+
+      // 确认选择用户
+      confirmSelectUser() {
+        if (this.selectedUser) {
+          this.formData.account = this.selectedUser.userId
+          // this.userList
+          const user = this.userList.find(
+            (user) => user.userId === this.formData.account
+          )
+          this.formData.password = user.password // 使用username作为密码
+          this.userSelectDialogVisible = false
+        } else {
+          this.$message.warning('请选择一个用户')
+        }
+      },
+
+      // 取消选择用户
+      cancelSelectUser() {
+        this.userSelectDialogVisible = false
+      },
+
+      // 格式化状态显示
+      formatStatus(row) {
+        return row.status === 1 ? '启用' : '停用'
+      },
       // 处理确认提交
       async handleConfirm() {
         // 防止重复提交
@@ -615,7 +799,8 @@
     },
   }
 </script>
-<style scoped>
+<style scoped lang="scss">
+  @import '@/styles/costAudit.scss';
   .formtDialog-content {
     padding: 20px 0;
   }

+ 34 - 18
src/components/costAudit/EstablishmentDialog.vue

@@ -37,7 +37,7 @@
         </el-form-item>
 
         <!-- 监审地区 -->
-        <el-form-item label="监审地区:">
+        <el-form-item label="监审地区:" prop="areaCode">
           <RegionSelector
             :initial-area-code="formData.areaCode"
             :disabled="false"
@@ -282,9 +282,9 @@
         </el-form-item>
 
         <!-- 监审任务负责人 -->
-        <el-form-item label="监审任务负责人:" prop="auditGroup">
+        <el-form-item label="监审任务负责人:" prop="leaderId">
           <el-select
-            v-model="formData.auditGroup"
+            v-model="formData.leaderId"
             placeholder="请选择负责人"
             style="width: 100%"
           >
@@ -298,9 +298,9 @@
         </el-form-item>
 
         <!-- 监审任务组成员 -->
-        <el-form-item label="监审任务组成员:" prop="auditTeamMembers">
+        <el-form-item label="监审任务组成员:" prop="projectMembers">
           <el-select
-            v-model="formData.auditTeamMembers"
+            v-model="formData.projectMembers"
             placeholder="请选择成员"
             style="width: 100%"
             multiple
@@ -431,9 +431,8 @@
           accordingFileUrl: '',
           otherFileUrl: '',
           expertStr: '',
-          auditGroup: '',
-          projectMembers: '',
-          auditTeamMembers: [],
+          leaderId: '',
+          projectMembers: [],
         },
         dictData: {
           attributionYear: [], // 归属年度
@@ -471,6 +470,9 @@
           auditType: [
             { required: true, message: '请选择监审形式', trigger: 'change' },
           ],
+          areaCode: [
+            { required: true, message: '请选择监审地区', trigger: 'change' },
+          ],
           auditPeriodArray: [
             {
               required: true,
@@ -478,14 +480,14 @@
               trigger: 'change',
             },
           ],
-          auditGroup: [
+          leaderId: [
             {
               required: true,
               message: '请选择监审任务负责人',
               trigger: 'change',
             },
           ],
-          auditTeamMembers: [
+          projectMembers: [
             {
               required: true,
               message: '请选择监审任务组成员',
@@ -506,7 +508,7 @@
             this.formData.needHearing = Number(this.initialData.needHearing)
             this.formData.isEmergency = Number(this.initialData.isEmergency)
 
-            this.formData.auditTeamMembers = this.initialData.projectMembers
+            this.formData.projectMembers = this.initialData.projectMembers
               ? this.initialData.projectMembers.split(',')
               : []
             if (this.formData.auditPeriod) {
@@ -695,7 +697,9 @@
 
       // 处理地区选择变化
       handleRegionChange(region) {
-        this.formData.areaCode = region.code
+        if (region && region.code) {
+          this.formData.areaCode = region.code
+        }
       },
 
       // 处理监审目录选择后的回调
@@ -760,13 +764,22 @@
 
       // 保存表单数据
       handleAdd() {
-        this.formData.projectMembers = this.formData.auditTeamMembers.join(',')
-        this.formData.auditedUnitId = this.formData.auditedUnitId.join(',')
         this.$refs.initiationForm.validate((valid) => {
           if (valid) {
             this.updateAuditPeriodString()
             // 提交数据
-            addProjectApproval(this.formData)
+            let data = {
+              ...this.formData,
+              projectMembers: Array.isArray(this.formData.projectMembers)
+                ? this.formData.projectMembers.join(',')
+                : this.formData.projectMembers || '',
+              auditedUnitId: (this.formData.auditedUnitId = Array.isArray(
+                this.formData.auditedUnitId
+              )
+                ? this.formData.auditedUnitId.join(',')
+                : this.formData.auditedUnitId || ''),
+            }
+            addProjectApproval(data)
               .then((res) => {
                 Message.success('立项成功')
                 this.$emit('save')
@@ -778,13 +791,16 @@
         })
       },
       handleSave() {
-        this.formData.projectMembers = this.formData.auditTeamMembers.join(',')
-        this.formData.auditedUnitId = this.formData.auditedUnitId.join(',')
         this.$refs.initiationForm.validate((valid) => {
           if (valid) {
             this.updateAuditPeriodString()
+            let data = {
+              ...this.formData,
+              projectMembers: this.formData.projectMembers.join(','),
+              auditedUnitId: this.formData.auditedUnitId.join(','),
+            }
             // 提交数据
-            editProjectApproval(this.formData)
+            editProjectApproval(data)
               .then((res) => {
                 Message.success('保存成功')
                 this.$emit('save')

+ 22 - 18
src/views/costAudit/projectInfo/auditProjectManage/annualReviewPlan/CatalogCascader.vue

@@ -5,6 +5,7 @@
     :options="catalogListOptions"
     :placeholder="formItem.placeholder || catalogProps.placeholder"
     v-bind="props"
+    @change="handleCascaderChange"
   ></el-cascader>
 </template>
 
@@ -39,6 +40,7 @@
             checkStrictly: true,
             label: 'catalogName',
             value: 'id',
+            emitPath: false,
           },
         },
       }
@@ -46,6 +48,7 @@
     watch: {
       value: {
         handler(newVal) {
+          this.catalogId = newVal
           // this.handleValueChange(newVal)
         },
         immediate: true, // 初始化时立即执行
@@ -66,25 +69,26 @@
       handleValueChange(newVal) {
         console.log('newVal', newVal)
         // 只有当目录数据加载完成后才处理回显
-        // if (this.catalogListOptions && this.catalogListOptions.length > 0) {
-        //   const formattedData = this.formatRelatedItemsForDisplay({
-        //     catalogId: {
-        //       value: newVal,
-        //       options: this.catalogListOptions,
-        //       id: 'id',
-        //       parentId: 'parentId',
-        //     },
-        //   })
-        //   this.catalogId = formattedData.catalogId || []
-        // }
+        if (this.catalogListOptions && this.catalogListOptions.length > 0) {
+          const formattedData = this.formatRelatedItemsForDisplay({
+            catalogId: {
+              value: newVal,
+              options: this.catalogListOptions,
+              id: 'id',
+              parentId: 'parentId',
+            },
+          })
+          console.log('formattedData', formattedData)
+          this.catalogId = formattedData.catalogId || []
+        }
+      },
+      handleCascaderChange(value) {
+        // 处理级联选择器多选数据
+        // const resultData = this.extractLastLevelValues({
+        //   catalogId: value,
+        // })
+        this.$emit('change', value)
       },
-      // handleCascaderChange(value) {
-      //   // 处理级联选择器多选数据
-      //   const resultData = this.extractLastLevelValues({
-      //     catalogId: value,
-      //   })
-      //   this.$emit('change', resultData.catalogId)
-      // },
     },
   }
 </script>

+ 4 - 6
src/views/costAudit/projectInfo/auditProjectManage/annualReviewPlan/index.vue

@@ -303,7 +303,7 @@
             </el-col>
             <!-- 监审地区 -->
             <el-col :span="24">
-              <el-form-item label="监审地区">
+              <el-form-item label="监审地区" prop="areaCode">
                 <RegionSelector
                   :initial-area-code="currentProject.areaCode"
                   :disabled="false"
@@ -529,6 +529,9 @@
           auditType: [
             { required: true, message: '请选择监审形式', trigger: 'change' },
           ],
+          areaCode: [
+            { required: true, message: '请选择监审地区', trigger: 'change' },
+          ],
           orgId: [
             { required: true, message: '请输入监审主体', trigger: 'blur' },
           ],
@@ -733,7 +736,6 @@
       // 处理监审目录选择后的回调
       handleCatalogChange(value) {
         this.currentProject.catalogId = value
-        console.log('选择的监审目录ID:', this.currentProject.catalogId)
       },
 
       // 处理新增
@@ -751,7 +753,6 @@
           auditType: '',
           areaCode: '',
           orgId: '',
-
           provinceId: '',
           cityId: '',
           districtId: '',
@@ -823,7 +824,6 @@
       },
       // 提交表单
       submitForm() {
-        console.log('提交表单', this.currentProject)
         this.currentProject.areaCode =
           this.areaCode || this.currentProject.areaCode
         this.currentProject.auditedUnitId = this.currentProject.auditedUnitId
@@ -837,7 +837,6 @@
                   Message.error(res.msg || '编辑失败')
                   return
                 }
-                console.log(res)
                 Message.success('编辑成功')
                 this.handleSearch()
               })
@@ -847,7 +846,6 @@
                   Message.error(res.msg || '新增失败')
                   return
                 }
-                console.log(res)
                 Message.success('新增成功')
                 this.handleSearch()
               })

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 251 - 638
src/views/costAudit/projectInfo/auditProjectManage/memoManage/index.vue


+ 571 - 0
src/views/costAudit/projectInfo/auditProjectManage/memoManage/memoManageMixin.js

@@ -0,0 +1,571 @@
+import {
+  getMemoList,
+  getMemoDetail,
+  addMemo,
+  updateMemo,
+  deleteMemo,
+  deleteMemoBatch,
+} from '@/api/memoManage.js'
+import { getAuditTaskList } from '@/api/auditInitiation.js'
+import moment from 'moment'
+
+export const memoManageMixin = {
+  data() {
+    // 表格列配置
+    const tableColumns = [
+      {
+        prop: 'reminderType',
+        label: '提醒',
+        width: 80,
+        headerAlign: 'center',
+        align: 'center',
+        slotName: 'reminder-type',
+      },
+      {
+        prop: 'projectName',
+        label: '成本监审任务',
+        width: 160,
+        headerAlign: 'center',
+        align: 'center',
+      },
+      {
+        prop: 'memoDate',
+        label: '日期',
+        width: 120,
+        headerAlign: 'center',
+        align: 'center',
+      },
+      {
+        prop: 'title',
+        label: '标题',
+        width: 120,
+        headerAlign: 'center',
+        align: 'center',
+      },
+      {
+        prop: 'content',
+        label: '内容',
+        minWidth: 200,
+        headerAlign: 'center',
+        align: 'center',
+      },
+      {
+        prop: 'action',
+        label: '操作',
+        width: 150,
+        headerAlign: 'center',
+        align: 'center',
+        slotName: 'action-buttons',
+        showOverflowTooltip: false,
+      },
+    ]
+
+    // 按项目查询标签页的表格列配置(项目名称列宽更大)
+    const projectTableColumns = [
+      ...tableColumns.map((col) => {
+        if (col.prop === 'projectName') {
+          return { ...col, width: 220 }
+        } else if (col.prop === 'title') {
+          return { ...col, width: 200 }
+        } else if (col.prop === 'content') {
+          return { ...col, minWidth: 300 }
+        }
+        return col
+      }),
+    ]
+
+    return {
+      dictData: {
+        reminderType: [],
+      },
+      activeTab: 'calendar',
+      selectedDate: new Date(),
+      today: new Date(),
+      // 表格配置
+      tableColumns,
+      projectTableColumns,
+      searchParams: {
+        year: '',
+        projectId: '',
+        content: '',
+        startTime: '',
+        endTime: '',
+        pageNum: 1,
+        pageSize: 50,
+      },
+      listTotal: 0,
+
+      memoList: [],
+      formTitle: '',
+      formDisabled: false,
+      formRules: {
+        projectId: [
+          {
+            required: true,
+            message: '请选择成本监审项目',
+            trigger: 'change',
+          },
+        ],
+        title: [{ required: true, message: '请输入标题', trigger: 'blur' }],
+        content: [{ required: true, message: '请输入内容', trigger: 'blur' }],
+        memoDate: [
+          { required: true, message: '请选择日期', trigger: 'change' },
+        ],
+        startTime: [
+          { required: true, message: '请选择开始时间', trigger: 'change' },
+        ],
+        endTime: [
+          { required: true, message: '请选择结束时间', trigger: 'change' },
+        ],
+        reminderType: [
+          { required: true, message: '请选择提醒方式', trigger: 'change' },
+        ],
+        // attachmentName: [
+        //   { required: true, message: '请上传附件', trigger: 'change' },
+        // ],
+      },
+      editForm: {
+        attachmentName: '',
+        attachmentSize: 0,
+        attachmentUrl: '',
+        content: '',
+        memoDate: '',
+        projectId: 0,
+        reminderType: '0',
+        task: '',
+        startTime: '',
+        endTime: '',
+        title: '',
+      },
+      // 时间数据字段已移除,改为直接使用editForm中的startTime和endTime
+      fileList: [],
+      isEditDialogOpen: false,
+      auditTaskList: [],
+    }
+  },
+  computed: {
+    // 获取指定日期的任务列表
+    getTasksByDate() {
+      return (date) => {
+        const dateStr = moment(date).format('YYYY-MM-DD')
+        return this.memoList.filter((task) => task.memoDate === dateStr)
+      }
+    },
+  },
+  watch: {
+    // // 监听选中日期变化,更新搜索参数
+    // selectedDate: {
+    //   handler(newVal) {
+    //     if (newVal) {
+    //       const monthMoment = moment(newVal).startOf('month')
+    //     }
+    //   },
+    //   deep: true,
+    // },
+  },
+  methods: {
+    // 根据提醒类型获取对应的颜色
+    getReminderTypeColor(type) {
+      const colorMap = {
+        1: '#c0c4cc', // 不提醒 - 浅灰色
+        2: '#f56c6c', // 提前1小时 - 红色
+        3: '#e6a23c', // 提前2小时 - 橙色
+        4: '#e6a23c', // 提前3小时 - 橙色
+        5: '#73c0de', // 提前1天 - 天蓝色
+        6: '#98fb98', // 提前2天 - 浅绿色
+        7: '#c0c4cc', // 提前3天 - 浅灰色
+      }
+      return colorMap[type] || '#c0c4cc'
+    },
+
+    // 时间处理逻辑已移除,改为直接使用editForm中的startTime和endTime
+    // 优化 saveFiles 方法
+    saveFiles(data) {
+      console.log('saveFiles', data)
+      this.fileList = data
+      this.editForm.attachmentName = data[0].fileName
+      this.editForm.attachmentSize = data[0].fileSize
+      this.editForm.attachmentUrl = data[0].savePath
+    },
+
+    // 优化 removeFile 方法
+    removeFile(index, removedFile, currentFiles) {
+      this.fileList = []
+      this.editForm.attachmentName = ''
+      this.editForm.attachmentSize = 0
+      this.editForm.attachmentUrl = ''
+    },
+    // 获取监审任务列表
+    async getAuditTaskList() {
+      try {
+        let params = {
+          projectName: '',
+        }
+        const res = await getAuditTaskList(params)
+        console.log('监审任务列表数据:', res)
+        if (res.code == 200) {
+          this.auditTaskList = res.value || []
+        }
+      } catch (error) {
+        console.error('获取监审任务列表数据失败:', error)
+      }
+    },
+    // 日历选择日期
+    handleDateClick(date, data) {
+      const dateStr = moment(date).format('YYYY-MM-DD')
+      const tasks = this.memoList.filter((task) => task.memoDate === dateStr)
+
+      this.searchParams.memoDate = dateStr
+      this.handleSearch()
+      // if (tasks.length > 0) {
+      //   this.searchParams.startTime = dateStr
+      //   this.searchParams.endTime = dateStr
+      // }
+    },
+
+    // 获取提醒类型的文本描述
+    getReminderTypeText(type) {
+      const textMap = {
+        0: '不提醒',
+        1: '提前1小时',
+        2: '提前2小时',
+        3: '提前3小时',
+        4: '提前1天',
+        5: '提前2天',
+        6: '提前3天',
+      }
+      return textMap[type] || '不提醒'
+    },
+
+    /**
+     * 获取指定日期的农历信息,包括节日和节气信息
+     * @param {Date} date - 日期对象
+     * @returns {Object|null} 包含公历农历详细信息的对象,如果超出范围则返回基本信息对象
+     */
+    getLunarInfo(date) {
+      try {
+        // 从日期对象获取年月日
+        const year = date.getFullYear()
+        const month = date.getMonth() + 1 // 月份从1开始
+        const day = date.getDate()
+
+        // 检查是否在solar2lunar支持的范围内 (1900.1.31~3000.12.31)
+        const isInRange =
+          (year > 1900 ||
+            (year === 1900 && month > 1) ||
+            (year === 1900 && month === 1 && day >= 31)) &&
+          (year < 3000 ||
+            (year === 3000 && month < 12) ||
+            (year === 3000 && month === 12 && day <= 31))
+
+        if (window.calendar && window.calendar.solar2lunar && isInRange) {
+          // 在范围内,调用calendar-converter.js中的solar2lunar函数
+          const lunarDate = window.calendar.solar2lunar(year, month, day)
+          if (lunarDate !== -1) {
+            return lunarDate || { IDayCn: '' }
+          }
+        }
+
+        // 超出范围时,返回基本日期信息
+        console.warn(
+          `日期 ${year}-${month}-${day} 超出了农历转换支持的范围(1900.1.31~3000.12.31)`
+        )
+        return this._getBasicDateInfo(year, month, day)
+      } catch (error) {
+        console.warn('农历转换出错:', error)
+        // 出错时也返回基本日期信息
+        return this._getBasicDateInfo(
+          date.getFullYear(),
+          date.getMonth() + 1,
+          date.getDate()
+        )
+      }
+    },
+
+    /**
+     * 获取基本的日期信息,当超出solar2lunar范围时使用
+     * @private
+     * @param {number} year - 阳历年
+     * @param {number} month - 阳历月
+     * @param {number} day - 阳历日
+     * @returns {Object} 基本日期信息对象
+     */
+    _getBasicDateInfo(year, month, day) {
+      const dateStr = `${year}-${month}-${day}`
+      // 创建基本信息对象,格式尽量与solar2lunar返回的一致
+      return {
+        date: dateStr,
+        lunarDate: '超出转换范围',
+        festival: null,
+        lunarFestival: null,
+        lYear: null,
+        lMonth: null,
+        lDay: null,
+        Animal: null,
+        IMonthCn: '',
+        IDayCn: '',
+        cYear: year,
+        cMonth: month,
+        cDay: day,
+        gzYear: '',
+        gzMonth: '',
+        gzDay: '',
+        isToday: false,
+        isLeap: false,
+        nWeek: new Date(year, month - 1, day).getDay() || 7, // 周日为7
+        ncWeek: `星期${
+          ['日', '一', '二', '三', '四', '五', '六'][
+            new Date(year, month - 1, day).getDay()
+          ]
+        }`,
+        isTerm: false,
+        Term: null,
+        astro: '',
+        outOfRange: true, // 标记为超出范围
+      }
+    },
+
+    // 上一个月
+    prevMonth() {
+      this.selectedDate = moment(this.selectedDate)
+        .subtract(1, 'month')
+        .toDate()
+    },
+
+    // 下一个月
+    nextMonth() {
+      this.selectedDate = moment(this.selectedDate).add(1, 'month').toDate()
+    },
+    // 获取备忘录列表
+    async handleSearch() {
+      try {
+        let params = {
+          ...this.searchParams,
+        }
+        const res = await getMemoList(params)
+        if (res.code == 200) {
+          this.memoList = res.value.records || []
+          this.memoList.forEach((item) => {
+            const date = new Date(item.memoDate)
+            item.day = date.getDate()
+          })
+          this.listTotal = res.value.total || 0
+        }
+      } catch (error) {
+        console.error('获取数据失败:', error)
+      }
+    },
+    handleReset() {
+      this.searchParams = {
+        pageNum: 1,
+        pageSize: 10,
+        startTime: '',
+        endTime: '',
+        year: '',
+        projectId: '',
+        content: '',
+      }
+      this.handleSearch()
+    },
+    handleCurrentChange(val) {
+      this.searchParams.pageNum = val
+      this.handleSearch()
+    },
+    handleSizeChange(val) {
+      this.searchParams.pageSize = val
+      this.handleSearch()
+    },
+    // 处理分页变化
+    handlePaginationChange({ currentPage, pageSize }) {
+      this.searchParams.pageNum = currentPage
+      this.searchParams.pageSize = pageSize
+      this.handleSearch()
+    },
+    // 初始化日历相关数据
+    initCalendarData() {
+      this.handleSearch()
+    },
+    onTabChange(tab) {
+      this.searchParams.startTime = ''
+      this.searchParams.endTime = ''
+      this.searchParams.year = ''
+      this.searchParams.projectId = ''
+      this.searchParams.content = ''
+      this.searchParams.pageNum = 1
+      if (tab.name == 'calendar') {
+        ;(this.currentYear = new Date().getFullYear()),
+          (this.currentMonth = new Date().getMonth() + 1), // 月份从1开始
+          this.setCalendarTitle()
+      } else {
+        this.handleSearch()
+      }
+    },
+
+    // prevMonth() {
+    //   console.log('日历切换:上一个月')
+    //   if (this.currentMonth === 1) {
+    //     this.currentYear--
+    //     this.currentMonth = 12
+    //   } else {
+    //     this.currentMonth--
+    //   }
+    //   this.setCalendarTitle()
+    // },
+
+    // nextMonth() {
+    //   console.log('日历切换:下一个月')
+    //   if (this.currentMonth === 12) {
+    //     this.currentYear++
+    //     this.currentMonth = 1
+    //   } else {
+    //     this.currentMonth++
+    //   }
+    //   this.setCalendarTitle()
+    // },
+
+    handleAdd() {
+      this.getAuditTaskList()
+      this.formTitle = '添加备忘录'
+      this.formDisabled = false
+      this.editForm = {
+        attachmentName: '',
+        attachmentSize: 0,
+        attachmentUrl: '',
+        content: '',
+        memoDate: '',
+        projectId: '',
+        reminderType: '0',
+        task: '',
+        startTime: '',
+        endTime: '',
+        title: '',
+      }
+      this.fileList = []
+      this.isEditDialogOpen = true
+    },
+
+    // 获取备忘录详情
+    async getMemoDetail(row) {
+      this.getAuditTaskList()
+      try {
+        let params = {
+          id: row.id,
+        }
+        const res = await getMemoDetail(params)
+        if (res.code == 200) {
+          // 处理时间范围
+          let startTime = ''
+          let endTime = ''
+          const data = { ...row, ...res.value }
+          if (data.timePeriod) {
+            const timeRange = data.timePeriod.split('-')
+            if (timeRange.length === 2) {
+              startTime = timeRange[0]
+              endTime = timeRange[1]
+            }
+          }
+          this.editForm = {
+            ...data,
+            startTime: startTime,
+            endTime: endTime,
+          }
+          // 删除timePeriod字段避免混淆
+          delete this.editForm.timePeriod
+          this.fileList = this.editForm.attachmentUrl
+            ? [res.value.attachmentUrl]
+            : []
+          this.isEditDialogOpen = true
+        }
+      } catch (error) {
+        console.error('获取详情数据失败:', error)
+      }
+    },
+
+    handleView(row) {
+      this.formTitle = '查看备忘录详情'
+      this.formDisabled = true
+      this.getMemoDetail(row)
+    },
+
+    handleEdit(row) {
+      this.formTitle = '编辑备忘录'
+      this.formDisabled = false
+      this.getMemoDetail(row)
+    },
+    handleDelete(row) {
+      this.$confirm('确定要删除该数据吗?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+        .then(async () => {
+          const response = await deleteMemo(row.id)
+          this.$message.success('删除成功')
+          // 重新加载数据
+          this.handleSearch()
+        })
+        .catch(() => {
+          this.$message.info('已取消删除')
+        })
+    },
+
+    handleSave() {
+      this.$refs['ruleForm'].validate((valid) => {
+        if (valid) {
+          const formData = { ...this.editForm }
+          // 合并开始时间和结束时间为timePeriod格式
+          formData.timePeriod = `${formData.startTime}-${formData.endTime}`
+          // 删除单独的时间字段,避免后端接收多余数据
+          delete formData.startTime
+          delete formData.endTime
+
+          if (formData.id) {
+            this.updateMemo(formData)
+          } else {
+            this.addMemo(formData)
+          }
+        } else {
+          console.log('表单验证失败')
+        }
+      })
+    },
+
+    // 添加备忘录
+    async addMemo(formData) {
+      try {
+        const res = await addMemo(formData)
+        if (res.code == 200) {
+          this.$message.success('添加成功')
+          this.handleSearch()
+          this.isEditDialogOpen = false
+        }
+      } catch (error) {
+        console.error('添加失败:', error)
+        this.$message.error('添加失败')
+      }
+    },
+
+    // 更新备忘录
+    async updateMemo(formData) {
+      delete formData.day
+      delete formData.projectName
+      try {
+        const res = await updateMemo(formData)
+        if (res.code == 200) {
+          this.$message.success('更新成功')
+          this.handleSearch()
+          this.isEditDialogOpen = false
+        }
+      } catch (error) {
+        console.error('更新失败:', error)
+        this.$message.error('更新失败')
+      }
+    },
+
+    // 设置日历标题
+    setCalendarTitle() {
+      // 可以在这里添加设置日历标题的逻辑
+      console.log(`当前显示: ${this.currentYear}年${this.currentMonth}月`)
+    },
+  },
+}

+ 2 - 2
src/views/costAudit/projectInfo/auditTaskManage/taskCustomizedRelease/basicInfoTab.vue

@@ -195,9 +195,9 @@
       </el-form-item>
 
       <!-- 监审任务负责人 -->
-      <el-form-item label="监审任务负责人:" prop="auditGroup">
+      <el-form-item label="监审任务负责人:" prop="leaderId">
         <el-select
-          v-model="formData.basicInfo.auditGroup"
+          v-model="formData.basicInfo.leaderId"
           placeholder="请选择负责人"
           style="width: 100%"
         >

+ 18 - 9
src/views/costAudit/projectInfo/auditTaskManage/taskCustomizedRelease/index.js

@@ -5,6 +5,7 @@ import {
   getCostProjectMaterialPageList,
   getCostProjectNodeTmpletePageList,
   getCostProjectNodeTmpleteGetDetail,
+  getCostProjectSurveyPageList,
 } from '@/api/taskCustomizedRelease.js'
 import { getAllUserList } from '@/api/uc'
 import { getCostSurveyTemplates } from '@/api/catalogManage.js'
@@ -145,7 +146,7 @@ export const taskMixin = {
         materialColumns: [
           {
             prop: 'informationType',
-            label: '资料类别',
+            label: '材料分类',
             width: 120,
             align: 'center',
             formatter: (row) => {
@@ -154,13 +155,13 @@ export const taskMixin = {
           },
           {
             prop: 'informationName',
-            label: '料名称',
+            label: '料名称',
             minWidth: 200,
             align: 'left',
           },
           {
             prop: 'informationRequire',
-            label: '资料要求',
+            label: '材料要求说明',
             minWidth: 300,
             align: 'left',
           },
@@ -467,7 +468,10 @@ export const taskMixin = {
       getCostProjectDetail({
         id: this.project.projectId,
       }).then((res) => {
-        this.formData.basicInfo = res.value || this.project
+        this.formData.basicInfo = {
+          ...this.project,
+          ...res.value,
+        }
       })
     },
     // 获取监审工作方案数据
@@ -491,16 +495,21 @@ export const taskMixin = {
         pageSize: this.materialData.pagination.pageSize,
         projectId: this.project.projectId,
       }).then((res) => {
-        this.materialData.list = res.value.value.records
-        this.materialData.pagination.total = res.value.value.total
+        if (res.code == 200) {
+          this.materialData.list = res.value.value.records
+          this.materialData.pagination.total = res.value.value.total
+        }
       })
     },
     // 获取成本调查表数据
     getSurveyData() {
-      getCostSurveyTemplates({
-        catalogId: this.project.projectId,
+      getCostProjectSurveyPageList({
+        pageNum: this.surveyData.pagination.currentPage,
+        pageSize: this.surveyData.pagination.pageSize,
+        projectId: this.project.projectId,
       }).then((res) => {
-        this.surveyData.survey = res.value
+        this.surveyData.survey = res.value.records
+        this.surveyData.pagination.total = res.value.total
       })
     },
     // 获取监审通知数据

+ 2 - 2
src/views/costAudit/projectInfo/auditTaskManage/taskCustomizedRelease/index.vue

@@ -374,10 +374,10 @@
         this.publishForm = {
           projectId: row.projectId || '',
           auditedUnit: row.auditedUnit || '',
-          auditedUnitName: this.UnitNameMap[row.auditedUnitId] || '',
+          auditedUnitName: this.getUnitName(row.auditedUnitId) || '',
           auditGroup: row.projectMembers ? row.projectMembers.split(',') : [],
           content: `${row.projectYear}年${row.projectName}已发布,请及时办理。`,
-          sendType: row.sendType ? row.sendType.split(',') : [],
+          sendType: row.sendType ? row.sendType.split(',') : ['1'],
         }
         this.publishDialogVisible = true
       },

+ 185 - 6
src/views/costAudit/projectInfo/auditTaskManage/taskCustomizedRelease/workflowTab.vue

@@ -101,7 +101,7 @@
             style="width: 100%"
           >
             <el-option
-              v-for="item in userList"
+              v-for="item in formatterMainUserList()"
               :key="item.userId"
               :label="item.fullname"
               :value="item.userId"
@@ -149,13 +149,13 @@
         </template>
         <template #endTime="{ row }">
           <el-date-picker
-            v-if="row.nodeType == 1"
             v-model="row.endTime"
             type="date"
             placeholder="请选择截止时间"
             format="yyyy-MM-dd"
             value-format="yyyy-MM-dd"
             style="width: 100%"
+            :picker-options="getPickerOptions(row)"
           ></el-date-picker>
         </template>
       </CostAuditTable>
@@ -202,7 +202,7 @@
             style="width: 100%"
           >
             <el-option
-              v-for="item in userList"
+              v-for="item in formatterMainUserList()"
               :key="item.userId"
               :label="item.fullname"
               :value="item.userId"
@@ -254,6 +254,7 @@
             format="yyyy-MM-dd"
             value-format="yyyy-MM-dd"
             style="width: 100%"
+            :disabled="isTimePickerDisabled"
           ></el-date-picker>
         </el-form-item>
       </el-form>
@@ -293,14 +294,159 @@
       },
     },
     data() {
-      return {}
+      return {
+        formData: {
+          currentStepRules: {
+            endTime: [
+              { required: true, message: '请选择截止时间', trigger: 'change' },
+              {
+                validator: (rule, value, callback) => {
+                  // 检查单个环节时间是否在总流程时间范围内
+                  if (
+                    !this.formData.workflow.plannedAuditStartDate ||
+                    !this.formData.workflow.plannedAuditEndDate
+                  ) {
+                    return callback()
+                  }
+                  if (value < this.formData.workflow.plannedAuditStartDate) {
+                    return callback(new Error('截止时间不能早于工作开始时间'))
+                  }
+                  if (value > this.formData.workflow.plannedAuditEndDate) {
+                    return callback(new Error('截止时间不能晚于工作结束时间'))
+                  }
+                  callback()
+                },
+                trigger: 'change',
+              },
+            ],
+          },
+        },
+      }
+    },
+    computed: {
+      // 计算是否应该禁用当前步骤的时间选择器
+      isTimePickerDisabled() {
+        // 如果当前没有选中步骤,不禁用
+        if (
+          !this.formData.currentStep ||
+          !this.formData.currentStep.processNodeKey
+        ) {
+          return false
+        }
+
+        // 获取当前步骤列表(优先使用已保存的列表)
+        const stepList =
+          this.workflowData.list.length > 0
+            ? this.workflowData.list
+            : this.workflowData.stepList
+
+        if (!stepList || stepList.length <= 1) {
+          return false
+        }
+
+        // 找到当前步骤在列表中的索引
+        const currentIndex = stepList.findIndex(
+          (item) =>
+            item.processNodeKey === this.formData.currentStep.processNodeKey
+        )
+
+        // 如果是第一个步骤或找不到当前步骤,不禁用
+        if (currentIndex <= 0) {
+          return false
+        }
+
+        // 检查上一个步骤是否有设置时间
+        const prevStep = stepList[currentIndex - 1]
+        return !prevStep.endTime
+      },
+    },
+    watch: {
+      // 监听workflowData.stepList变化,动态更新下一个环节的最小可选时间
+      'workflowData.stepList': {
+        handler(newList) {
+          // 对步骤列表按顺序排序,确保时间验证的准确性
+          if (newList && newList.length > 0) {
+            // 这里可以根据需要添加排序逻辑,假设步骤已经按顺序排列
+          }
+        },
+        deep: true,
+      },
     },
-    computed: {},
     mounted() {},
 
     methods: {
       formatterUserList(userId) {
-        return this.userList.filter((item) => item.userId !== userId)
+        // 筛选出除主办人员之外的人员
+        return this.formatterMainUserList().filter(
+          (item) => item.userId !== userId
+        )
+      },
+      formatterMainUserList() {
+        // 防御性编程,确保userList存在
+        if (!this.userList || !Array.isArray(this.userList)) {
+          return []
+        }
+
+        // 防御性编程,确保project.projectMembers存在且为字符串
+        if (
+          !this.project ||
+          !this.project.projectMembers ||
+          typeof this.project.projectMembers !== 'string'
+        ) {
+          return this.userList // 返回全部用户作为后备方案
+        }
+
+        try {
+          // 分割项目组成员ID并过滤用户列表
+          const projectMemberIds = this.project.projectMembers.split(',')
+          const filteredUsers = this.userList.filter((item) =>
+            projectMemberIds.includes(item.userId)
+          )
+          return filteredUsers
+        } catch (error) {
+          return this.userList // 出错时返回全部用户作为后备方案
+        }
+      },
+      // 获取日期选择器的配置选项,动态设置最小可选日期
+      getPickerOptions(row) {
+        const stepList = this.workflowData.stepList
+        const rowIndex = stepList.findIndex(
+          (item) => item.processNodeKey === row.processNodeKey
+        )
+
+        let pickerOptions = {
+          disabledDate: (time) => {
+            // 基础限制:不能早于工作开始时间,不能晚于工作结束时间
+            const startLimit = this.formData.workflow.plannedAuditStartDate
+              ? new Date(this.formData.workflow.plannedAuditStartDate).getTime()
+              : null
+            const endLimit = this.formData.workflow.plannedAuditEndDate
+              ? new Date(this.formData.workflow.plannedAuditEndDate).getTime()
+              : null
+
+            if (startLimit && time.getTime() < startLimit - 8.64e7) {
+              return true // 禁用开始时间之前的日期
+            }
+            if (endLimit && time.getTime() > endLimit) {
+              return true // 禁用结束时间之后的日期
+            }
+
+            // 如果不是第一个步骤,需要确保时间大于上一个步骤的时间
+            if (rowIndex > 0) {
+              const prevStep = stepList[rowIndex - 1]
+              if (prevStep && prevStep.endTime) {
+                const prevEndTime = new Date(prevStep.endTime).getTime()
+                if (time.getTime() <= prevEndTime - 8.64e7) {
+                  return true // 禁用上一步骤结束时间之前的日期
+                }
+              }
+            }
+
+            return false
+          },
+        }
+
+        return pickerOptions
       },
       handleSetWorkflow() {
         this.getUser()
@@ -383,6 +529,39 @@
           this.$message.error('请选择预定的监审工作结束日期')
           return
         }
+
+        // 验证环节时间顺序,确保下一个环节的时间大于上一个环节的时间
+        let stepList =
+          type === 'list' ? this.workflowData.list : this.workflowData.stepList
+        if (stepList && stepList.length > 1) {
+          // 按顺序排序步骤(假设存在排序字段或按数组顺序)
+          const sortedSteps = [...stepList].sort((a, b) => {
+            // 假设步骤有某种排序标识,这里简单按数组顺序处理
+            return stepList.indexOf(a) - stepList.indexOf(b)
+          })
+
+          // 验证每个步骤的时间是否符合要求
+          for (let i = 1; i < sortedSteps.length; i++) {
+            const currentStep = sortedSteps[i]
+            const prevStep = sortedSteps[i - 1]
+
+            // 检查当前步骤和上一步骤是否都有时间设置
+            if (currentStep.endTime && prevStep.endTime) {
+              if (new Date(currentStep.endTime) <= new Date(prevStep.endTime)) {
+                this.$message.error(
+                  `第${i + 1}个环节的截止时间必须大于第${i}个环节的截止时间`
+                )
+                return
+              }
+            } else if (currentStep.endTime && !prevStep.endTime) {
+              this.$message.error(`请先设置第${i}个环节的截止时间`)
+              return
+            } else if (!currentStep.endTime && prevStep.endTime) {
+              this.$message.error(`请设置第${i + 1}个环节的截止时间`)
+              return
+            }
+          }
+        }
         this.loading.save = true
         let data = {
           nodeReqList: [

+ 42 - 22
src/views/home/index.vue

@@ -41,21 +41,23 @@
           </div>
           <ul class="news-list card-content">
             <li v-for="(item, idx) in newsList" :key="idx" class="news-item">
-              <i></i>
               <div class="news-content">
-                <div class="news-title">{{ item.content }}</div>
-                <div>
+                <div class="news-title">
+                  <i class="el-icon-arrow-right"></i>
+                  {{ item.content }}
+                </div>
+                <div class="news-meta">
                   <div class="left-icon">
                     <img
                       src="@/assets/index_images/index-icon3@2x.png"
-                      alt=""
+                      alt="管理员"
                     />
-                    <span></span>
+                    <span>管理员</span>
                   </div>
                   <div class="left-icon">
                     <img
                       src="@/assets/index_images/index-icon4@2x.png"
-                      alt=""
+                      alt="时间"
                     />
                     <span>{{ item.date }}</span>
                   </div>
@@ -287,29 +289,28 @@
         searchKeyword: '',
         newsList: [
           {
-            content:
-              '做好公立幼儿园监审工作,认真完成幼儿园教育成本监审资料核对和整理工作。',
-            time: '2025-06-10',
+            content: '依据定价管理规范,全面开展《山西省定价目录》修订工作',
+            date: '2025-05-06 14:00',
           },
           {
             content:
-              '为推进市发改委工作,具体负责组织和调配用人单位《山西省定价目录》权限范围内定价成本监审工作。',
-            time: '2025-06-10',
+              '为适应市场发展新形势,正式启动定价管理范畴内《山西省定价目录》的调整优化工作',
+            date: '2025-05-06 14:00',
           },
           {
             content:
-              '负责定价成本监审政策研究制定,组织编制《山西省定价目录》范围内的定价成本监审规则和方法。',
-            time: '2025-06-10',
+              '按照定价管理的既定流程和标准,积极推进《山西省定价目录》的更新完善事宜',
+            date: '2025-05-06 14:00',
           },
           {
             content:
-              '需参与制定或修订成本监审相关的法规政策、成本监审目录,确定重大成本监审项目。',
-            time: '2025-06-10',
+              '基于当前价格管理工作的实际需求,着力实施定价管理中《山西省定价目录》的修改完善行动',
+            date: '2025-05-06 14:00',
           },
           {
             content:
-              '进一步提升会计解释的科学性与准确性,全面提升会计监督的目的性、针对性和有效性。',
-            time: '2025-06-10',
+              '为进一步提升定价管理的科学性与精准性,全面开启《山西省定价目录》的深度修订进程',
+            date: '2025-05-06 14:00',
           },
         ],
         todoList: [
@@ -691,16 +692,35 @@
   .news-item:last-child {
     border-bottom: none;
   }
-  .news-item i {
+  .news-content {
+    line-height: 1.6;
+    font-size: 14px;
+    flex: 1;
+  }
+  .news-title {
+    display: flex;
+    align-items: flex-start;
+    margin-bottom: 8px;
+  }
+  .news-title i {
     color: #f56c6c;
     margin-right: 8px;
     font-size: 14px;
     margin-top: 2px;
+    flex-shrink: 0;
   }
-  .news-content {
-    line-height: 1.6;
-    font-size: 14px;
-    flex: 1;
+  .news-meta {
+    display: flex;
+    align-items: center;
+    margin-left: 22px;
+  }
+  .news-meta .left-icon {
+    margin-right: 15px;
+  }
+  .news-meta .left-icon span {
+    margin-left: 4px;
+    color: #909399;
+    font-size: 12px;
   }
   .calendar-day {
     position: relative;

Vissa filer visades inte eftersom för många filer har ändrats