Эх сурвалжийг харах

pms 修井日报 全员数量 休假人员数量

zhangcl 19 цаг өмнө
parent
commit
d75be2d99b

+ 1 - 0
src/utils/dict.ts

@@ -281,6 +281,7 @@ export enum DICT_TYPE {
   PMS_THING_MODEL_UNIT = 'pms_thing_model_unit', // pms属性模板单位
   PMS_PROJECT_TASK_SCHEDULE = 'constructionStatus',  // 日报 项目管理 任务计划
   PMS_PROJECT_TASK_RY_SCHEDULE = 'rigStatus',  // 日报 项目管理 瑞鹰项目进度
+  PMS_PROJECT_TASK_RY_REPAIR_SCHEDULE = 'ryRepairStatus',  // 日报 瑞鹰 修井 项目进度
   PMS_PROJECT_SETTLEMENT = 'rq_iot_project_settlement_method',  // 日报 项目管理 结算方式
   PMS_PROJECT_OVERSEA_FLAG = 'rq_iot_project_oversea_flag',  // 日报 项目管理 是否海外项目
   PMS_PROJECT_AREA = 'rq_iot_project_area',  // 日报 项目管理 海外项目所属区域

+ 64 - 40
src/views/pms/iotrydailyreport/IotRyXjDailyReportForm.vue

@@ -116,8 +116,15 @@
       <el-form-item label="生产动态" prop="productionStatus">
         <el-input v-model="formData.productionStatus" placeholder="请输入生产动态" type="textarea"/>
       </el-form-item>
-      <el-form-item label="人员情况" prop="personnel">
-        <el-input v-model="formData.personnel" placeholder="请输入人员情况" type="textarea"/>
+      <el-form-item label="全员数量" prop="totalStaffNum">
+        <el-input v-model="formData.totalStaffNum" placeholder="请输入全员数量" @input="calculateOnDutyStaffNum"/>
+      </el-form-item>
+      <el-form-item label="在岗人数" prop="onDutyStaffNum">
+        <el-input v-model="formData.onDutyStaffNum" placeholder="" disabled
+                  :class="{'yellow-bg': formData.onDutyStaffNum < 0}"/>
+      </el-form-item>
+      <el-form-item label="休假人员数量" prop="leaveStaffNum">
+        <el-input v-model="formData.leaveStaffNum" placeholder="请输入休假人员数量" @input="calculateOnDutyStaffNum"/>
       </el-form-item>
       <el-form-item label="备注" prop="remark">
         <el-input v-model="formData.remark" placeholder="请输入备注" type="textarea"/>
@@ -140,44 +147,6 @@ defineOptions({ name: 'IotRyXjDailyReportForm' })
 const { t } = useI18n() // 国际化
 const message = useMessage() // 消息弹窗
 
-// 添加 props 接收行数据
-const props = defineProps({
-  rowData: {
-    type: Object,
-    default: () => ({})
-  }
-})
-
-// 监听 props.rowData 的变化
-watch(() => props.rowData, (newVal) => {
-  if (newVal) {
-    displayData.value.deptName = newVal.deptName || ''
-    displayData.value.contractName = newVal.contractName || ''
-    displayData.value.taskName = newVal.taskName || ''
-    displayData.value.designWellDepth = newVal.designWellDepth || ''
-    displayData.value.technique = newVal.technique || ''
-    displayData.value.wellCategory = newVal.wellCategory || ''
-    displayData.value.wellControlLevel = newVal.wellControlLevel || ''
-    displayData.value.casingPipeSize = newVal.casingPipeSize || ''
-  }
-}, { immediate: true })
-
-const dialogVisible = ref(false) // 弹窗的是否展示
-const dialogTitle = ref('') // 弹窗的标题
-const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
-const formType = ref('') // 表单的类型:create - 新增;update - 修改
-
-// 添加显示数据对象
-const displayData = ref({
-  deptName: '',
-  contractName: '',
-  taskName: '',
-  designWellDepth: '',
-  technique: '',
-  wellCategory: '',
-  wellControlLevel: '',
-  casingPipeSize: ''
-})
 
 const formData = ref({
   id: undefined,
@@ -207,6 +176,9 @@ const formData = ref({
   nextPlan: undefined,
   rigStatus: undefined,
   personnel: undefined,
+  totalStaffNum: undefined,
+  leaveStaffNum: undefined,
+  onDutyStaffNum: undefined,
   mudDensity: undefined,
   mudViscosity: undefined,
   lateralLength: undefined,
@@ -220,6 +192,56 @@ const formData = ref({
   processInstanceId: undefined,
   auditStatus: undefined,
 })
+
+// 添加 props 接收行数据
+const props = defineProps({
+  rowData: {
+    type: Object,
+    default: () => ({})
+  }
+})
+
+/** 计算在岗人数 */
+const calculateOnDutyStaffNum = () => {
+  // 转换为数字进行计算,处理空值情况
+  const total = formData.value.totalStaffNum ? Number(formData.value.totalStaffNum) : 0
+  const leave = formData.value.leaveStaffNum ? Number(formData.value.leaveStaffNum) : 0
+  formData.value.onDutyStaffNum = total - leave
+}
+
+// 监听 props.rowData 的变化
+watch(() => props.rowData, (newVal) => {
+  if (newVal) {
+    displayData.value.deptName = newVal.deptName || ''
+    displayData.value.contractName = newVal.contractName || ''
+    displayData.value.taskName = newVal.taskName || ''
+    displayData.value.designWellDepth = newVal.designWellDepth || ''
+    displayData.value.technique = newVal.technique || ''
+    displayData.value.wellCategory = newVal.wellCategory || ''
+    displayData.value.wellControlLevel = newVal.wellControlLevel || ''
+    displayData.value.casingPipeSize = newVal.casingPipeSize || ''
+  }
+  // 初始化时计算在岗人数
+  calculateOnDutyStaffNum()
+}, { immediate: true })
+
+const dialogVisible = ref(false) // 弹窗的是否展示
+const dialogTitle = ref('') // 弹窗的标题
+const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
+const formType = ref('') // 表单的类型:create - 新增;update - 修改
+
+// 添加显示数据对象
+const displayData = ref({
+  deptName: '',
+  contractName: '',
+  taskName: '',
+  designWellDepth: '',
+  technique: '',
+  wellCategory: '',
+  wellControlLevel: '',
+  casingPipeSize: ''
+})
+
 const formRules = reactive({
 })
 const formRef = ref() // 表单 Ref
@@ -248,6 +270,8 @@ const open = async (type: string, id?: number) => {
     formLoading.value = true
     try {
       formData.value = await IotRyDailyReportApi.getIotRyDailyReport(id)
+      // 数据加载后计算在岗人数
+      calculateOnDutyStaffNum()
     } finally {
       formLoading.value = false
     }

+ 35 - 0
src/views/pms/iotrydailyreport/xjindex.vue

@@ -183,6 +183,18 @@
                 </el-tooltip>
               </template>
             </el-table-column>
+            <el-table-column label="全员数量" align="center" prop="totalStaffNum" :width="columnWidths.totalStaffNum"/>
+            <!--
+            <el-table-column label="在岗人数" align="center" prop="onDutyStaffNum" :width="columnWidths.onDutyStaffNum"/> -->
+            <el-table-column label="在岗人数" align="center" :width="columnWidths.onDutyStaffNum">
+              <template #default="scope">
+                <!-- 动态计算:在岗人数 = 全员数量 - 休假人员数量 -->
+                {{
+                  (Number(scope.row.totalStaffNum) || 0) - (Number(scope.row.leaveStaffNum) || 0)
+                }}
+              </template>
+            </el-table-column>
+            <el-table-column label="休假人员数量" align="center" prop="leaveStaffNum" :width="columnWidths.leaveStaffNum"/>
             <el-table-column label="操作" align="center" :width="columnWidths.operation" fixed="right">
               <template #default="scope">
                 <el-button
@@ -318,6 +330,9 @@ const columnWidths = ref({
   wellInclination: '150px',
   transitTime: '150px',
   productionStatus: '200px',
+  totalStaffNum: '150px',
+  onDutyStaffNum: '150px',
+  leaveStaffNum: '150px',
   currentOperation: '200px',
   nextPlan: '200px',
   ryNptReason: '150px',
@@ -414,6 +429,23 @@ const cellStyle = ({ row, column, rowIndex, columnIndex }: { row: any; column: a
       };
     }
   }
+
+  // 3. 处理“在岗人数”列:动态计算 + 负数黄色背景
+  if (column.label === "在岗人数") { // 按列名匹配(避免prop绑定问题)
+    // 步骤1:计算在岗人数(处理空值/非数字情况,默认设为0)
+    const totalStaff = Number(row.totalStaffNum) || 0;
+    const leaveStaff = Number(row.leaveStaffNum) || 0;
+    const onDutyStaff = totalStaff - leaveStaff;
+
+    // 步骤2:若计算值为负数,设置黄色提醒样式
+    if (onDutyStaff < 0) {
+      return {
+        backgroundColor: "#fff9e6", // 浅黄色背景
+        fontWeight: "bold"
+      };
+    }
+  }
+
   // 默认返回空对象,不应用特殊样式
   return {};
 };
@@ -543,6 +575,9 @@ const calculateColumnWidths = () => {
   calculateColumnMinWidth('azimuth', '方位(°)', (row: any) => row.azimuth);
   calculateColumnMinWidth('designWellStruct', '设计井身结构', (row: any) => row.designWellStruct);
   calculateColumnMinWidth('productionStatus', '生产动态', (row: any) => row.productionStatus);
+  calculateColumnMinWidth('totalStaffNum', '全员数量', (row: any) => row.totalStaffNum);
+  calculateColumnMinWidth('leaveStaffNum', '休假人员数量', (row: any) => row.leaveStaffNum);
+  calculateColumnMinWidth('onDutyStaffNum', '在岗人数', (row: any) => row.onDutyStaffNum);
   calculateColumnMinWidth('ratedProductionTime', '额定生产时间(H)', (row: any) => row.ratedProductionTime);
   calculateColumnMinWidth('productionTime', '生产时间(H)', (row: any) => row.productionTime);
   calculateColumnMinWidth('nonProductionTime', '非生产时间(H)', (row: any) => row.nonProductionTime);