安全管理以及质量管理下的模块增删改查功能

This commit is contained in:
jia 2023-12-21 17:40:41 +08:00
parent 96251e4c81
commit 498899c1a9
81 changed files with 9237 additions and 2232 deletions

26
src/api/quality_accept.ts Normal file
View File

@ -0,0 +1,26 @@
import request from '@/utils/request'
// 质量验收列表
export function qualityacceptLists(params: any) {
return request.get({ url: '/quality.quality_accept/lists', params })
}
// 添加质量验收
export function qualityacceptAdd(params: any) {
return request.post({ url: '/quality.quality_accept/add', params })
}
// 编辑质量验收
export function qualityacceptEdit(params: any) {
return request.post({ url: '/quality.quality_accept/edit', params })
}
// 删除质量验收
export function qualityacceptDelete(params: any) {
return request.post({ url: '/quality.quality_accept/delete', params })
}
// 质量验收详情
export function qualityacceptDetail(params: any) {
return request.get({ url: '/quality.quality_accept/detail', params })
}

View File

@ -0,0 +1,26 @@
import request from '@/utils/request'
// 质量事故列表
export function qualityaccidentLists(params: any) {
return request.get({ url: '/quality.quality_accident/lists', params })
}
// 添加质量事故
export function qualityaccidentAdd(params: any) {
return request.post({ url: '/quality.quality_accident/add', params })
}
// 编辑质量事故
export function qualityaccidentEdit(params: any) {
return request.post({ url: '/quality.quality_accident/edit', params })
}
// 删除质量事故
export function qualityaccidentDelete(params: any) {
return request.post({ url: '/quality.quality_accident/delete', params })
}
// 质量事故详情
export function qualityaccidentDetail(params: any) {
return request.get({ url: '/quality.quality_accident/detail', params })
}

26
src/api/quality_check.ts Normal file
View File

@ -0,0 +1,26 @@
import request from '@/utils/request'
// 质量检查列表
export function qualitycheckLists(params: any) {
return request.get({ url: '/quality.quality_check/lists', params })
}
// 添加质量检查
export function qualitycheckAdd(params: any) {
return request.post({ url: '/quality.quality_check/add', params })
}
// 编辑质量检查
export function qualitycheckEdit(params: any) {
return request.post({ url: '/quality.quality_check/edit', params })
}
// 删除质量检查
export function qualitycheckDelete(params: any) {
return request.post({ url: '/quality.quality_check/delete', params })
}
// 质量检查详情
export function qualitycheckDetail(params: any) {
return request.get({ url: '/quality.quality_check/detail', params })
}

View File

@ -0,0 +1,26 @@
import request from '@/utils/request'
// 检查性质列表
export function qualitychecknatureLists(params: any) {
return request.get({ url: '/quality.quality_check_nature/lists', params })
}
// 添加检查性质
export function qualitychecknatureAdd(params: any) {
return request.post({ url: '/quality.quality_check_nature/add', params })
}
// 编辑检查性质
export function qualitychecknatureEdit(params: any) {
return request.post({ url: '/quality.quality_check_nature/edit', params })
}
// 删除检查性质
export function qualitychecknatureDelete(params: any) {
return request.post({ url: '/quality.quality_check_nature/delete', params })
}
// 检查性质详情
export function qualitychecknatureDetail(params: any) {
return request.get({ url: '/quality.quality_check_nature/detail', params })
}

View File

@ -0,0 +1,26 @@
import request from '@/utils/request'
// 质量检测列表
export function qualitydetectionLists(params: any) {
return request.get({ url: '/quality.quality_detection/lists', params })
}
// 添加质量检测
export function qualitydetectionAdd(params: any) {
return request.post({ url: '/quality.quality_detection/add', params })
}
// 编辑质量检测
export function qualitydetectionEdit(params: any) {
return request.post({ url: '/quality.quality_detection/edit', params })
}
// 删除质量检测
export function qualitydetectionDelete(params: any) {
return request.post({ url: '/quality.quality_detection/delete', params })
}
// 质量检测详情
export function qualitydetectionDetail(params: any) {
return request.get({ url: '/quality.quality_detection/detail', params })
}

View File

@ -0,0 +1,26 @@
import request from '@/utils/request'
// 质量检测模板列表
export function qualitydetectiontempLists(params: any) {
return request.get({ url: '/quality.quality_detection_temp/lists', params })
}
// 添加质量检测模板
export function qualitydetectiontempAdd(params: any) {
return request.post({ url: '/quality.quality_detection_temp/add', params })
}
// 编辑质量检测模板
export function qualitydetectiontempEdit(params: any) {
return request.post({ url: '/quality.quality_detection_temp/edit', params })
}
// 删除质量检测模板
export function qualitydetectiontempDelete(params: any) {
return request.post({ url: '/quality.quality_detection_temp/delete', params })
}
// 质量检测模板详情
export function qualitydetectiontempDetail(params: any) {
return request.get({ url: '/quality.quality_detection_temp/detail', params })
}

26
src/api/quality_event.ts Normal file
View File

@ -0,0 +1,26 @@
import request from '@/utils/request'
// 质量事件列表
export function qualityeventLists(params: any) {
return request.get({ url: '/quality.quality_event/lists', params })
}
// 添加质量事件
export function qualityeventAdd(params: any) {
return request.post({ url: '/quality.quality_event/add', params })
}
// 编辑质量事件
export function qualityeventEdit(params: any) {
return request.post({ url: '/quality.quality_event/edit', params })
}
// 删除质量事件
export function qualityeventDelete(params: any) {
return request.post({ url: '/quality.quality_event/delete', params })
}
// 质量事件详情
export function qualityeventDetail(params: any) {
return request.get({ url: '/quality.quality_event/detail', params })
}

26
src/api/quality_mbo.ts Normal file
View File

@ -0,0 +1,26 @@
import request from '@/utils/request'
// 质量目标列表
export function qualitymboLists(params: any) {
return request.get({ url: '/quality.quality_mbo/lists', params })
}
// 添加质量目标
export function qualitymboAdd(params: any) {
return request.post({ url: '/quality.quality_mbo/add', params })
}
// 编辑质量目标
export function qualitymboEdit(params: any) {
return request.post({ url: '/quality.quality_mbo/edit', params })
}
// 删除质量目标
export function qualitymboDelete(params: any) {
return request.post({ url: '/quality.quality_mbo/delete', params })
}
// 质量目标详情
export function qualitymboDetail(params: any) {
return request.get({ url: '/quality.quality_mbo/detail', params })
}

26
src/api/quality_modify.ts Normal file
View File

@ -0,0 +1,26 @@
import request from '@/utils/request'
// 质量整改列表
export function qualitymodifyLists(params: any) {
return request.get({ url: '/quality.quality_modify/lists', params })
}
// 添加质量整改
export function qualitymodifyAdd(params: any) {
return request.post({ url: '/quality.quality_modify/add', params })
}
// 编辑质量整改
export function qualitymodifyEdit(params: any) {
return request.post({ url: '/quality.quality_modify/edit', params })
}
// 删除质量整改
export function qualitymodifyDelete(params: any) {
return request.post({ url: '/quality.quality_modify/delete', params })
}
// 质量整改详情
export function qualitymodifyDetail(params: any) {
return request.get({ url: '/quality.quality_modify/detail', params })
}

View File

@ -0,0 +1,26 @@
import request from '@/utils/request'
// 专业类别列表
export function professionalcategoryLists(params: any) {
return request.get({ url: '/quality.quality_professional_category/lists', params })
}
// 添加专业类别
export function professionalcategoryAdd(params: any) {
return request.post({ url: '/quality.quality_professional_category/add', params })
}
// 编辑专业类别
export function professionalcategoryEdit(params: any) {
return request.post({ url: '/quality.quality_professional_category/edit', params })
}
// 删除专业类别
export function professionalcategoryDelete(params: any) {
return request.post({ url: '/quality.quality_professional_category/delete', params })
}
// 专业类别详情
export function professionalcategoryDetail(params: any) {
return request.get({ url: '/quality.quality_professional_category/detail', params })
}

View File

@ -0,0 +1,26 @@
import request from '@/utils/request'
// 质量规范列表
export function qualityspecificationLists(params: any) {
return request.get({ url: '/quality.quality_specification/lists', params })
}
// 添加质量规范
export function qualityspecificationAdd(params: any) {
return request.post({ url: '/quality.quality_specification/add', params })
}
// 编辑质量规范
export function qualityspecificationEdit(params: any) {
return request.post({ url: '/quality.quality_specification/edit', params })
}
// 删除质量规范
export function qualityspecificationDelete(params: any) {
return request.post({ url: '/quality.quality_specification/delete', params })
}
// 质量规范详情
export function qualityspecificationDetail(params: any) {
return request.get({ url: '/quality.quality_specification/detail', params })
}

View File

@ -0,0 +1,26 @@
import request from '@/utils/request'
// 质量监督列表
export function qualitysuperviseLists(params: any) {
return request.get({ url: '/quality.quality_supervise/lists', params })
}
// 添加质量监督
export function qualitysuperviseAdd(params: any) {
return request.post({ url: '/quality.quality_supervise/add', params })
}
// 编辑质量监督
export function qualitysuperviseEdit(params: any) {
return request.post({ url: '/quality.quality_supervise/edit', params })
}
// 删除质量监督
export function qualitysuperviseDelete(params: any) {
return request.post({ url: '/quality.quality_supervise/delete', params })
}
// 质量监督详情
export function qualitysuperviseDetail(params: any) {
return request.get({ url: '/quality.quality_supervise/detail', params })
}

View File

@ -1,25 +0,0 @@
import request from '@/utils/request'
// 安全规范列表
export function apireturnedLists(params: any) {
return request.get({ url: '/safety.safety_standard/lists', params })
}
// 添加安全规范
export function apireturnedAdd(params: any) {
return request.post({ url: '/safety.safety_standard/add', params })
}
// 编辑安全规范
export function apireturnedEdit(params: any) {
return request.post({ url: '/safety.safety_standard/edit', params })
}
// 删除安全规范
export function apireturnedDelete(params: any) {
return request.post({ url: '/safety.safety_standard/delete', params })
}
// 安全规范详情
export function apireturnedDetail(params: any) {
return request.get({ url: '/safety.safety_standard/detail', params })
}

View File

@ -0,0 +1,25 @@
import request from '@/utils/request'
// 应急预案列表
export function safetyemergencyplanLists(params: any) {
return request.get({ url: '/safety.safety_emergency_plan/lists', params })
}
// 添加应急预案
export function safetyemergencyplanAdd(params: any) {
return request.post({ url: '/safety.safety_emergency_plan/add', params })
}
// 编辑应急预案
export function safetyemergencyplanEdit(params: any) {
return request.post({ url: '/safety.safety_emergency_plan/edit', params })
}
// 删除应急预案
export function safetyemergencyplanDelete(params: any) {
return request.post({ url: '/safety.safety_emergency_plan/delete', params })
}
// 应急预案详情
export function safetyemergencyplanDetail(params: any) {
return request.get({ url: '/safety.safety_emergency_plan/detail', params })
}

View File

@ -1,25 +1,25 @@
import request from '@/utils/request'
// 安全规范列表
export function apireturnedLists(params: any) {
return request.get({ url: '/safety.safety_standard/lists', params })
// 安全评估列表
export function safetyevaluateLists(params: any) {
return request.get({ url: '/safety.safety_evaluate/lists', params })
}
// 添加安全规范
export function apireturnedAdd(params: any) {
return request.post({ url: '/safety.safety_standard/add', params })
// 添加安全评估
export function safetyevaluateAdd(params: any) {
return request.post({ url: '/safety.safety_evaluate/add', params })
}
// 编辑安全规范
export function apireturnedEdit(params: any) {
return request.post({ url: '/safety.safety_standard/edit', params })
// 编辑安全评估
export function safetyevaluateEdit(params: any) {
return request.post({ url: '/safety.safety_evaluate/edit', params })
}
// 删除安全规范
export function apireturnedDelete(params: any) {
return request.post({ url: '/safety.safety_standard/delete', params })
// 删除安全评估
export function safetyevaluateDelete(params: any) {
return request.post({ url: '/safety.safety_evaluate/delete', params })
}
// 安全规范详情
export function apireturnedDetail(params: any) {
return request.get({ url: '/safety.safety_standard/detail', params })
// 安全评估详情
export function safetyevaluateDetail(params: any) {
return request.get({ url: '/safety.safety_evaluate/detail', params })
}

View File

@ -1,25 +1,26 @@
import request from '@/utils/request'
// 安全规范列表
export function apireturnedLists(params: any) {
return request.get({ url: '/safety.safety_standard/lists', params })
export function safetyeventLists(params: any) {
return request.get({ url: '/safety.safety_event/lists', params })
}
// 添加安全规范
export function apireturnedAdd(params: any) {
return request.post({ url: '/safety.safety_standard/add', params })
export function safetyeventAdd(params: any) {
return request.post({ url: '/safety.safety_event/add', params })
}
// 编辑安全规范
export function apireturnedEdit(params: any) {
return request.post({ url: '/safety.safety_standard/edit', params })
export function safetyeventEdit(params: any) {
return request.post({ url: '/safety.safety_event/edit', params })
}
// 删除安全规范
export function apireturnedDelete(params: any) {
return request.post({ url: '/safety.safety_standard/delete', params })
export function safetyeventDelete(params: any) {
return request.post({ url: '/safety.safety_event/delete', params })
}
// 安全规范详情
export function apireturnedDetail(params: any) {
return request.get({ url: '/safety.safety_standard/detail', params })
export function safetyeventDetail(params: any) {
return request.get({ url: '/safety.safety_event/detail', params })
}

View File

@ -1,25 +1,25 @@
import request from '@/utils/request'
// 安全规范列表
export function apireturnedLists(params: any) {
return request.get({ url: '/safety.safety_standard/lists', params })
// 危险源列表
export function safetyhazardLists(params: any) {
return request.get({ url: '/safety.safety_hazard/lists', params })
}
// 添加安全规范
export function apireturnedAdd(params: any) {
return request.post({ url: '/safety.safety_standard/add', params })
// 添加危险源
export function safetyhazardAdd(params: any) {
return request.post({ url: '/safety.safety_hazard/add', params })
}
// 编辑安全规范
export function apireturnedEdit(params: any) {
return request.post({ url: '/safety.safety_standard/edit', params })
// 编辑危险源
export function safetyhazardEdit(params: any) {
return request.post({ url: '/safety.safety_hazard/edit', params })
}
// 删除安全规范
export function apireturnedDelete(params: any) {
return request.post({ url: '/safety.safety_standard/delete', params })
// 删除危险源
export function safetyhazardDelete(params: any) {
return request.post({ url: '/safety.safety_hazard/delete', params })
}
// 安全规范详情
export function apireturnedDetail(params: any) {
return request.get({ url: '/safety.safety_standard/detail', params })
// 危险源详情
export function safetyhazardDetail(params: any) {
return request.get({ url: '/safety.safety_hazard/detail', params })
}

View File

@ -1,25 +1,25 @@
import request from '@/utils/request'
// 安全规范列表
export function apireturnedLists(params: any) {
return request.get({ url: '/safety.safety_standard/lists', params })
// 安全生产月表列表
export function safetyproductmonthLists(params: any) {
return request.get({ url: '/safety.safety_product_month/lists', params })
}
// 添加安全规范
export function apireturnedAdd(params: any) {
return request.post({ url: '/safety.safety_standard/add', params })
// 添加安全生产月表
export function safetyproductmonthAdd(params: any) {
return request.post({ url: '/safety.safety_product_month/add', params })
}
// 编辑安全规范
export function apireturnedEdit(params: any) {
return request.post({ url: '/safety.safety_standard/edit', params })
// 编辑安全生产月表
export function safetyproductmonthEdit(params: any) {
return request.post({ url: '/safety.safety_product_month/edit', params })
}
// 删除安全规范
export function apireturnedDelete(params: any) {
return request.post({ url: '/safety.safety_standard/delete', params })
// 删除安全生产月表
export function safetyproductmonthDelete(params: any) {
return request.post({ url: '/safety.safety_product_month/delete', params })
}
// 安全规范详情
export function apireturnedDetail(params: any) {
return request.get({ url: '/safety.safety_standard/detail', params })
// 安全生产月表详情
export function safetyproductmonthDetail(params: any) {
return request.get({ url: '/safety.safety_product_month/detail', params })
}

View File

@ -1,25 +1,25 @@
import request from '@/utils/request'
// 安全规范列表
export function apireturnedLists(params: any) {
return request.get({ url: '/safety.safety_standard/lists', params })
// 安全演练列表
export function safetyrehearsalLists(params: any) {
return request.get({ url: '/safety.safety_rehearsal/lists', params })
}
// 添加安全规范
export function apireturnedAdd(params: any) {
return request.post({ url: '/safety.safety_standard/add', params })
// 添加安全演练
export function safetyrehearsalAdd(params: any) {
return request.post({ url: '/safety.safety_rehearsal/add', params })
}
// 编辑安全规范
export function apireturnedEdit(params: any) {
return request.post({ url: '/safety.safety_standard/edit', params })
// 编辑安全演练
export function safetyrehearsalEdit(params: any) {
return request.post({ url: '/safety.safety_rehearsal/edit', params })
}
// 删除安全规范
export function apireturnedDelete(params: any) {
return request.post({ url: '/safety.safety_standard/delete', params })
// 删除安全演练
export function safetyrehearsalDelete(params: any) {
return request.post({ url: '/safety.safety_rehearsal/delete', params })
}
// 安全规范详情
export function apireturnedDetail(params: any) {
return request.get({ url: '/safety.safety_standard/detail', params })
// 安全演练详情
export function safetyrehearsalDetail(params: any) {
return request.get({ url: '/safety.safety_rehearsal/detail', params })
}

View File

@ -1,25 +1,25 @@
import request from '@/utils/request'
// 安全监督列表
export function apireturnedLists(params: any) {
return request.get({ url: '/safety.safety_standard/lists', params })
export function safetysuperviseLists(params: any) {
return request.get({ url: '/safety.safety_supervise/lists', params })
}
// 添加安全监督
export function apireturnedAdd(params: any) {
return request.post({ url: '/safety.safety_standard/add', params })
export function safetysuperviseAdd(params: any) {
return request.post({ url: '/safety.safety_supervise/add', params })
}
// 编辑安全监督
export function apireturnedEdit(params: any) {
return request.post({ url: '/safety.safety_standard/edit', params })
export function safetysuperviseEdit(params: any) {
return request.post({ url: '/safety.safety_supervise/edit', params })
}
// 删除安全监督
export function apireturnedDelete(params: any) {
return request.post({ url: '/safety.safety_standard/delete', params })
export function safetysuperviseDelete(params: any) {
return request.post({ url: '/safety.safety_supervise/delete', params })
}
// 安全监督详情
export function apireturnedDetail(params: any) {
return request.get({ url: '/safety.safety_standard/detail', params })
export function safetysuperviseDetail(params: any) {
return request.get({ url: '/safety.safety_supervise/detail', params })
}

View File

@ -1,5 +1,6 @@
<template>
<div> <el-card>
<div>
<el-card>
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
<el-tab-pane label="处理意见" name="first" class="demo-tabs-a">
<div>当前步骤 发起工单</div>
@ -7,7 +8,7 @@
<div>送审步骤 技术处理</div>
<div class="userlist">
<div>指定处理人</div>
<div v-for="item in userlist" class="userlist-con">
<div v-for="item in userlist1" class="userlist-con">
<img src="@/assets/images/no_perms.png" alt="" />
{{ item.name }}
</div>
@ -18,16 +19,17 @@
<div class="flex user">
<div>流程抄送</div>
<div>0</div>
<div>{{ userlist1.length }}</div>
<div @click="dialogVisible = true"><img src="@/assets/images/no_perms.png" alt="" /></div>
</div>
</el-tab-pane>
<el-tab-pane label="流程日志" name="second">暂无流程日志</el-tab-pane>
</el-tabs>
</el-card>
<el-dialog v-model="dialogVisible" title="人员选择器" width="30%" :before-close="handleClose">
<div>
<el-radio-group v-model="isCollapse" style="margin-bottom: 20px">
<el-radio-group v-model="isCollapse" style="margin-bottom: 20px" @change="clckuser">
<el-radio-button :label="1">全部人员</el-radio-button>
<el-radio-button :label="2">按部门筛选</el-radio-button>
<el-radio-button :label="3">按岗位筛选</el-radio-button>
@ -36,50 +38,116 @@
<div v-if="isCollapse == 1" style="margin-bottom: 20px">
<el-input v-model="content" clearable placeholder="搜索人员" />
<div style="margin-top: 20px">
<el-radio-group v-model="radio">
<el-radio :label="3">
<div class="radio-con">
<div class="radioa">
<img src="@/assets/images/no_perms.png" alt="" />
<el-checkbox-group v-model="vallist">
<div v-for="(item, i) in uesrlist" :key="i" class="radiolist">
<el-checkbox :label="item">
<div class="radio-con">
<div class="radioa">
<img :src="item.avatar" alt="" />
</div>
<div class="radiob">
<div class="radiob_a">{{ item.name }}</div>
<div class="radiob_b">
<text v-if="item.org_name.length > 0">{{ item.org_name }}</text>
<text v-if="item.dept_name.length > 0">/{{ item.dept_name }}</text>
<text v-if="item.job_name.length > 0">/{{ item.job_name }}</text>
</div>
</div>
</div>
<div class="radiob">
<div class="radiob_a">test</div>
<div class="radiob_b">企管宝/市场部/市场员</div>
</div>
</div>
</el-radio><br />
</el-radio-group>
</el-checkbox>
</div>
</el-checkbox-group>
</div>
</div>
<div v-if="isCollapse == 2">
<div v-for="item in companylist">
<div class="lad">{{ item.name1 }}</div>
<div class="lad">
<div>{{ item.name2 }}</div>
<div>{{ item.name2 }}</div>
<div>{{ item.name2 }}</div>
<div>{{ item.name2 }}</div>
<div v-if="isshow">
<div v-for="(item, i) in deparmetlist" :key="i">
<div class="lad">{{ i }}</div>
<div class="lads">
<div class="flex " v-for="(items, k) in item" style="justify-content: space-between;" @click="deparmetclck(items)">
<div>{{ items.name }}</div>
<div class="Collapsebj">{{ items.admin_num }}</div>
</div>
</div>
</div>
</div>
<div v-else>
<!-- <el-input v-model="content" clearable placeholder="搜索人员" style="margin-bottom: 20px;" /> -->
<el-checkbox-group v-model="vallist">
<div v-for="(item, i) in deparmetlist1" :key="i" class="radiolist">
<el-checkbox :label="item">
<div class="radio-con">
<div class="radioa">
<img :src="item.avatar" alt="" />
</div>
<div class="radiob">
<div class="radiob_a">{{ item.name }}</div>
<div class="radiob_b">
<text v-if="item.org_name.length > 0">{{ item.org_name }}</text>
<text v-if="item.dept_name.length > 0">/{{ item.dept_name }}</text>
<text v-if="item.job_name.length > 0">/{{ item.job_name }}</text>
</div>
</div>
</div>
</el-checkbox>
</div>
</el-checkbox-group>
</div>
</div>
<div v-if="isCollapse == 3">
<div>11</div>
<div>111</div>
<div>11</div>
<div>11</div>
<div v-if="isshow1">
<div class="lads ">
<div class="flex " v-for="(item, j) in jobslist" :key="j" style="justify-content: space-between;" @click="gwclck(item)">
<div>{{ item.name }}</div>
<div class="Collapsebj">{{ item.admin_num }}</div>
</div>
</div>
</div>
<div v-else>
<!-- <el-input v-model="content" clearable placeholder="搜索人员" style="margin-bottom: 20px;" /> -->
<el-checkbox-group v-model="vallist">
<div v-for="(item, i) in jobslist1" :key="i" class="radiolist">
<el-checkbox :label="item">
<div class="radio-con">
<div class="radioa">
<img :src="item.avatar" alt="" />
</div>
<div class="radiob">
<div class="radiob_a">{{ item.name }}</div>
<div class="radiob_b">
<text v-if="item.org_name.length > 0">{{ item.org_name }}</text>
<text v-if="item.dept_name.length > 0">/{{ item.dept_name }}</text>
<text v-if="item.job_name.length > 0">/{{ item.job_name }}</text>
</div>
</div>
</div>
</el-checkbox>
</div>
</el-checkbox-group>
</div>
</div>
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="dialogVisible = false"> 已选 </el-button>
<el-button type="primary" @click="userclick"> {{ vallist.length > 0 ? '已选' : '未选' }}
<text v-if="vallist.length > 0">{{ vallist.length }}</text> </el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script lang="ts" setup>
import { computed, nextTick, onMounted, reactive, shallowRef, watch } from 'vue'
import { getAdminsByAll, getAllDept, getAllJobs, getAdminsByDept, getAdminsByJob } from '@/api/common'
const active = ref(0);
const isCollapse = ref(1);
@ -93,7 +161,16 @@ console.log(props.list)
// list.splice(0, list.length, ...props.list)
const activeName = ref('first')
const content = ref('')
const userlist = reactive([{ name: 1 }, { name: 1 }, { name: 1 }, { name: 1 }]);
const userlist1 = reactive([{ name: 1 }, { name: 1 }, { name: 1 }, { name: 1 }]);
const uesrlist = reactive([]);
const deparmetlist = reactive({})
const deparmetlist1 = reactive([])
const jobslist = reactive({})
const jobslist1 = reactive([])
const isshow = ref(true);
const isshow1 = ref(true);
const vallist = ref([])
const companylist = reactive([
{
name1: "哈哈公司",
@ -111,6 +188,78 @@ const companylist = reactive([
const next = () => {
if (active.value++ > 2) active.value = 0;
};
//
const clckuser = (e) => {
isshow.value = true
isshow1.value = true
}
//
const userclick = () => {
dialogVisible.value = false
// console.log(vallist.value, 9999999999999)
userlist1.forEach((user, index) => {
Object.assign(user, vallist.value);
});
}
//
const getlist = () => {
getAdminsByAll().then((res) => {
// console.log(res)
Object.assign(uesrlist, res)
})
}
//
const deparmet = () => {
getAllDept().then((res) => {
console.log(res)
Object.assign(deparmetlist, res)
})
}
//
const deparmetclck = (item: { id: any }) => {
console.log(item)
getAdminsByDept({ 'dept_id': item.id }).then((res) => {
if (res.length > 0) {
Object.assign(deparmetlist1, res)
isshow.value = false
}
})
}
//
const Jobs = () => {
getAllJobs().then((res) => {
console.log(res)
Object.assign(jobslist, res)
})
}
//
const gwclck = (item: { id: any }) => {
getAdminsByJob({ 'job_id': item.id }).then((res) => {
if (res.length > 0) {
Object.assign(jobslist1, res)
isshow1.value = false
}
})
}
onMounted(() => {
getlist()
deparmet()
Jobs()
})
const dialogVisible = ref(false);
const handleClose = (done: () => void) => {
done();
@ -129,6 +278,32 @@ const handleClose = (done: () => void) => {
}
}
.radiolist {
height: 50px;
// border: 1px solid red;
margin-bottom: 5px;
.radio-con {
display: flex;
width: 500px;
.radioa {
display: flex;
justify-items: center;
align-items: center;
img {
width: 40px;
height: 40px;
border-radius: 50%;
margin-right: 10px;
}
}
}
}
.userlist {
display: flex;
@ -153,25 +328,42 @@ const handleClose = (done: () => void) => {
}
}
.radio-con {
display: flex;
width: 500px;
.radioa {
img {
width: 40px;
height: 40px;
border-radius: 50%;
}
}
}
.lad {
padding: 10px 0;
border-bottom: 1px solid #f7f7f7;
div {
padding: 10px 0;
margin: 10px 0;
}
.Collapsebj {
background-color: #3e8ef7;
height: 20px;
width: 20px;
line-height: 20px;
text-align: center;
border-radius: 6px;
color: #f7f7f7;
}
}
.lads {
padding: 10px 0;
div {
margin: 10px 0;
}
.Collapsebj {
background-color: #3e8ef7;
height: 20px;
width: 20px;
line-height: 20px;
text-align: center;
border-radius: 6px;
color: #f7f7f7;
}
}
</style>

View File

@ -0,0 +1,167 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="安全规范详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="12">
<el-form-item label="组织名称">
{{ formData.org_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="部门名称">
{{ formData.dept_name
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范名称">
{{ formData.name
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范类别">
{{ formData.type
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发布部门">
{{ formData.publish_dep
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范附件">
<div>
<div v-for="( item, index ) in formDataannex " style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
Object.assign(formData, data)
if (data.file && data.file.length > 0) {
if (data.file.includes(",")) {
const arry1 = data.file.split(',').map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
} else {
const arry1 = [{ name: `文件1`, uri: data.file }]
Object.assign(formDataannex, arry1)
console.log(formDataannex)
}
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,279 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="550px" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="24">
<el-form-item label="组织名称" prop="org_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.org_id" clearable placeholder="请选择组织" @change="deptrmt">
<el-option v-for="(item, index) in list1" :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="部门名称" prop="dept_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.dept_id" clearable placeholder="请选择部门">
<el-option v-for="( item, index ) in list2 " :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="名称" prop="project_id" @click="showDialog = true">
<el-input v-model="project_name" clearable placeholder="请输入名称" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="验收日期" prop="accept_date">
<el-date-picker class="flex-1 !flex" v-model="formData.accept_date" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择验收日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="验收类型" prop="type">
<el-input v-model="formData.type" clearable placeholder="请输入验收类型" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="验收工程师" prop="engineer">
<el-input v-model="formData.engineer" clearable placeholder="请输入验收工程师" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="验收内容" prop="content">
<el-input v-model="formData.content" clearable placeholder="请输入验收内容" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附件" prop="field127">
<el-upload accept=".pdf" class="upload-demo" :show-file-list="false" aria-hidden="true" :headers="{ Token: userStore.token }" :action="base_url + '/upload/file'" :on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="( item, index ) in formDataannex " style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<porjectDialog @customEvent="customEvent"></porjectDialog>
</el-dialog>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="projectEdit">
import porjectDialog from '@/components/project/index.vue'
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { qualityacceptAdd, qualityacceptEdit, qualityacceptDetail } from '@/api/quality_accept'
import { toChinesNum } from "@/utils/util";
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
import { isEmail, isIdCard, isPhone } from '@/utils/validate'
import type { PropType } from 'vue'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const protype = reactive([])
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const list1 = reactive([])
const list2 = reactive([])
const showDialog = ref(false)
const project_name = ref('')
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
const userInfo = userStore.userInfo
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
//
const customEvent = (e: any) => {
formData.project_id = e.id;
project_name.value = e.name;
showDialog.value = false;
};
//
const getlist = () => {
getAll().then((res) => {
Object.assign(list1, res)
})
}
//
const deptrmt = (e) => {
getlist1(e)
}
//
const getlist1 = (id: any) => {
deptAll({ 'org_id': id }).then((res) => {
Object.assign(list2, res)
})
}
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑质量目标表' : '新增质量目标表'
})
//
const formData = reactive({
id: '',
dept_id: '',
org_id: "",
project_id: "",
accept_date: "",
type: '',
file: '',
engineer: "",
content: "",
remark: "",
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.file && data.file.length > 0) {
if (data.file.includes(",")) {
const arry1 = data.file.split(',').map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
} else {
const arry1 = [{ name: `文件1`, uri: data.file }]
Object.assign(formDataannex, arry1)
console.log(formDataannex)
}
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
if (data.dept_id) {
getlist1(data.dept_id
)
}
project_name.value = data.project_name
}
const getDetail = async (row: Record<string, any>) => {
const data = await qualityacceptDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.file = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await qualityacceptEdit(data)
: await qualityacceptAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getlist()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,148 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="验收类型" prop="type">
<el-input class="w-[280px]" v-model="queryParams.type" clearable placeholder="请输入验收类型" />
</el-form-item>
<el-form-item label="验收工程师" prop="engineer">
<el-input class="w-[280px]" v-model="queryParams.engineer" clearable placeholder="请输入验收工程师" />
</el-form-item>
<el-form-item label="验收日期" prop="publish_dep">
<el-date-picker v-model="queryParams.accept_date" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择验收日期">
</el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['quality.quality_accept/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['quality.quality_accept/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="组织名称" prop="org_name" show-overflow-tooltip />
<el-table-column label="部门名称" prop="dept_name" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="验收类型" prop="type" show-overflow-tooltip />
<el-table-column label="验收日期" prop="accept_date" show-overflow-tooltip />
<el-table-column label="验收内容" prop="content" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
<el-table-column label="规范附件" prop="file" show-overflow-tooltip />
<el-table-column label="操作" width="150" fixed="right">
<template #default="{ row }">
<el-button v-perms="['quality.quality_accept/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['quality.quality_accept/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<!-- <el-button v-perms="['quality.quality_accept/detail']" link @click="handledetail(row)">
详情
</el-button> -->
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { qualityacceptLists, qualityacceptDelete, qualityacceptDetail } from '@/api/quality_accept'
import { timeFormat } from '@/utils/util'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
//
const queryParams = reactive({
accept_date: '',
engineer: '',
type: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('refund_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: qualityacceptLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await qualityacceptDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await qualityacceptDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await qualityacceptDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
getLists()
</script>

View File

@ -0,0 +1,167 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="安全规范详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="12">
<el-form-item label="组织名称">
{{ formData.org_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="部门名称">
{{ formData.dept_name
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范名称">
{{ formData.name
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范类别">
{{ formData.type
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发布部门">
{{ formData.publish_dep
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范附件">
<div>
<div v-for="( item, index ) in formDataannex " style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
Object.assign(formData, data)
if (data.file && data.file.length > 0) {
if (data.file.includes(",")) {
const arry1 = data.file.split(',').map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
} else {
const arry1 = [{ name: `文件1`, uri: data.file }]
Object.assign(formDataannex, arry1)
console.log(formDataannex)
}
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,303 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="550px" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="24">
<el-form-item label="组织名称" prop="org_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.org_id" clearable placeholder="请选择组织" @change="deptrmt">
<el-option v-for="(item, index) in list1" :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="部门名称" prop="dept_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.dept_id" clearable placeholder="请选择部门">
<el-option v-for="( item, index ) in list2 " :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="项目名称" prop="project_id" @click="showDialog = true">
<el-input v-model="project_name" clearable placeholder="请输入项目名称" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="项目编码" prop="project_id" @click="showDialog = true">
<el-input v-model="project_code" clearable placeholder="请输入项目编码" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="事故类型" prop="type">
<el-input v-model="formData.type" clearable placeholder="请输入事故类型" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="发生日期" prop="require">
<el-date-picker class="flex-1 !flex" v-model="formData.happen_date" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择发生日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="设备事故" prop="device_accident">
<el-input v-model="formData.device_accident" clearable placeholder="请输入设备事故" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="承包商人员" prop="contractor_user">
<el-input v-model="formData.contractor_user" clearable placeholder="请输入承包商人员" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="非本企业人员" prop="our_company_user">
<el-input v-model="formData.our_company_user" clearable placeholder="请输入非本企业人员" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="本企业人员" prop="not_our_company_user">
<el-input v-model="formData.not_our_company_user" clearable placeholder="请输入本企业人员" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="内容" prop="content">
<el-input v-model="formData.content" type="textarea" clearable placeholder="请输入内容" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附件" prop="field127">
<el-upload accept=".pdf" class="upload-demo" :show-file-list="false" aria-hidden="true" :headers="{ Token: userStore.token }" :action="base_url + '/upload/file'" :on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="( item, index ) in formDataannex " style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<porjectDialog @customEvent="customEvent"></porjectDialog>
</el-dialog>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="projectEdit">
import porjectDialog from '@/components/project/index.vue'
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { qualityaccidentAdd, qualityaccidentEdit, qualityaccidentDetail } from '@/api/quality_accident'
import { toChinesNum } from "@/utils/util";
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
import { isEmail, isIdCard, isPhone } from '@/utils/validate'
import type { PropType } from 'vue'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const protype = reactive([])
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const list1 = reactive([])
const list2 = reactive([])
const showDialog = ref(false)
const project_name = ref('')
const project_code = ref('')
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
const userInfo = userStore.userInfo
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
//
const customEvent = (e: any) => {
formData.project_id = e.id;
project_name.value = e.name;
project_code.value = e.project_code
showDialog.value = false;
};
//
const getlist = () => {
getAll().then((res) => {
Object.assign(list1, res)
})
}
//
const deptrmt = (e) => {
getlist1(e)
}
//
const getlist1 = (id: any) => {
deptAll({ 'org_id': id }).then((res) => {
Object.assign(list2, res)
})
}
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑安全事故表' : '新增安全事故表'
})
//
const formData = reactive({
id: '',
project_id: "",
name: "",
happen_date: "",
type: "",
file: '',
remark: "",
dept_id: '',
org_id: "",
device_accident: "",
contractor_user: "",
not_our_company_user: "",
our_company_user: "",
content: "",
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.file && data.file.length > 0) {
if (data.file.includes(",")) {
const arry1 = data.file.split(',').map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
} else {
const arry1 = [{ name: `文件1`, uri: data.file }]
Object.assign(formDataannex, arry1)
console.log(formDataannex)
}
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
if (data.dept_id) {
getlist1(data.dept_id
)
}
project_name.value = data.project_name
project_code.value = data.project_code
}
const getDetail = async (row: Record<string, any>) => {
const data = await qualityaccidentDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.file = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await qualityaccidentEdit(data)
: await qualityaccidentAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getlist()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,153 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="事故类型" prop="type">
<el-input class="w-[280px]" v-model="queryParams.device_accident" clearable placeholder="请输入事故类型" />
</el-form-item>
<el-form-item label="设备事故" prop="type">
<el-input class="w-[280px]" v-model="queryParams.device_accident" clearable placeholder="请输入设备事故" />
</el-form-item>
<el-form-item label="发生日期" prop="require">
<el-date-picker class="w-[280px]" v-model="queryParams.happen_date" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择发生日期">
</el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['quality.quality_accident/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['quality.quality_accident/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="组织名称" prop="org_name" show-overflow-tooltip />
<el-table-column label="部门名称" prop="dept_name" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="项目编码" prop="project_code" show-overflow-tooltip />
<el-table-column label="发生时间" prop="happen_date" show-overflow-tooltip />
<el-table-column label="事故类型" prop="type" show-overflow-tooltip />
<el-table-column label="设备事故" prop="device_accident" show-overflow-tooltip />
<el-table-column label="承包商人员" prop="contractor_user" show-overflow-tooltip />
<el-table-column label="非本企业人员" prop="not_our_company_user" show-overflow-tooltip />
<el-table-column label="本企业人员" prop="our_company_user" show-overflow-tooltip />
<el-table-column label="内容" prop="content" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
<el-table-column label="附件" prop="file" show-overflow-tooltip />
<el-table-column label="操作" width="150" fixed="right">
<template #default="{ row }">
<el-button v-perms="['quality.quality_accident/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['quality.quality_accident/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { qualityaccidentLists, qualityaccidentDelete, qualityaccidentDetail } from '@/api/quality_accident'
import { timeFormat } from '@/utils/util'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
//
const queryParams = reactive({
happen_date: '',
device_accident: '',
type: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('refund_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: qualityaccidentLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await qualityaccidentDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await qualityaccidentDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await qualityaccidentDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
getLists()
</script>

View File

@ -0,0 +1,167 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="安全规范详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="12">
<el-form-item label="组织名称">
{{ formData.org_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="部门名称">
{{ formData.dept_name
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范名称">
{{ formData.name
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范类别">
{{ formData.type
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发布部门">
{{ formData.publish_dep
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范附件">
<div>
<div v-for="( item, index ) in formDataannex " style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
Object.assign(formData, data)
if (data.file && data.file.length > 0) {
if (data.file.includes(",")) {
const arry1 = data.file.split(',').map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
} else {
const arry1 = [{ name: `文件1`, uri: data.file }]
Object.assign(formDataannex, arry1)
console.log(formDataannex)
}
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,286 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="组织名称" prop="org_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.org_id" clearable placeholder="请选择组织" @change="deptrmt">
<el-option v-for="(item, index) in list1" :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="部门名称" prop="dept_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.dept_id" clearable placeholder="请选择部门">
<el-option v-for="( item, index ) in list2 " :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="project_id" @click="showDialog = true">
<el-input v-model="project_name" clearable placeholder="请输入项目名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码" prop="project_id" @click="showDialog = true">
<el-input v-model="project_code" clearable placeholder="请输入项目编码" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查性质" prop="check_nature">
<el-input v-model="formData.check_nature" clearable placeholder="请输入检查性质" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查日期" prop="check_date">
<el-date-picker class="flex-1 !flex" v-model="formData.check_date" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择检查日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="整改期限" prop="modify_term">
<el-input v-model="formData.modify_term" clearable placeholder="请输入整改期限" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查人" prop="check_user">
<el-input v-model="formData.check_user" clearable placeholder="请输入检查人" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查单位" prop="check_unit">
<el-input v-model="formData.check_unit" clearable placeholder="请输入检查单位" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="整改单位" prop="modify_unit">
<el-input v-model="formData.modify_unit" clearable placeholder="请输入整改单位" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="责任人" prop="resp_user">
<el-input v-model="formData.resp_user" clearable placeholder="请输入责任人" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查项" prop="check_item">
<el-input v-model="formData.check_item" clearable placeholder="请输入检查项" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="质量隐患" prop="quality_hazards">
<el-input v-model="formData.quality_hazards" clearable placeholder="请输入质量隐患" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查结果" prop="check_result">
<el-input v-model="formData.check_result" clearable placeholder="请输入检查结果" />
</el-form-item>
</el-col>
</el-row>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<porjectDialog @customEvent="customEvent"></porjectDialog>
</el-dialog>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="projectEdit">
import porjectDialog from '@/components/project/index.vue'
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { qualitycheckAdd, qualitycheckEdit, qualitycheckDetail } from '@/api/quality_check'
import { toChinesNum } from "@/utils/util";
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
import { isEmail, isIdCard, isPhone } from '@/utils/validate'
import type { PropType } from 'vue'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const protype = reactive([])
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const list1 = reactive([])
const list2 = reactive([])
const showDialog = ref(false)
const project_name = ref('')
const project_code = ref('')
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
const userInfo = userStore.userInfo
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
//
const customEvent = (e: any) => {
formData.project_id = e.id;
project_name.value = e.name;
project_code.value = e.project_code
showDialog.value = false;
};
//
const getlist = () => {
getAll().then((res) => {
Object.assign(list1, res)
})
}
//
const deptrmt = (e) => {
getlist1(e)
}
//
const getlist1 = (id: any) => {
deptAll({ 'org_id': id }).then((res) => {
Object.assign(list2, res)
})
}
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑质量检查表' : '新增质量检查表'
})
//
const formData = reactive({
id: '',
org_id: '',
dept_id: '',
project_id: '',
check_date: '',
check_user: '',
check_unit: '',
check_item: '',
check_result: '',
modify_unit: '',
resp_user: '',
modify_term: '',
check_nature: '',
quality_hazards: '',
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
if (data.dept_id) {
getlist1(data.dept_id
)
}
project_name.value = data.project_name
project_code.value = data.project_code
}
const getDetail = async (row: Record<string, any>) => {
const data = await qualitycheckDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await qualitycheckEdit(data)
: await qualitycheckAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getlist()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,156 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="检查性质" prop="check_nature">
<el-input class="w-[280px]" v-model="queryParams.check_nature" clearable placeholder="请输入检查性质" />
</el-form-item>
<el-form-item label="检查人" prop="check_user">
<el-input class="w-[280px]" v-model="queryParams.check_user" clearable placeholder="请输入检查人" />
</el-form-item>
<el-form-item label="检查单位" prop="check_unit">
<el-input class="w-[280px]" v-model="queryParams.check_unit" clearable placeholder="请输入检查单位" />
</el-form-item>
<el-form-item label="整改单位" prop="modify_unit">
<el-input class="w-[280px]" v-model="queryParams.modify_unit" clearable placeholder="请输入整改单位" />
</el-form-item>
<el-form-item label="责任人" prop="resp_user">
<el-input class="w-[280px]" v-model="queryParams.resp_user" clearable placeholder="请输入责任人" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['quality.quality_check/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['quality.quality_check/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="组织名称" prop="org_name" show-overflow-tooltip />
<el-table-column label="部门名称" prop="dept_name" show-overflow-tooltip />
<el-table-column label="检查性质" prop="check_nature" show-overflow-tooltip />
<el-table-column label="检查日期" prop="check_date" show-overflow-tooltip />
<el-table-column label="整改期限" prop="modify_term" show-overflow-tooltip />
<el-table-column label="检查人" prop="check_user" show-overflow-tooltip />
<el-table-column label="检查单位" prop="check_unit" show-overflow-tooltip />
<el-table-column label="整改单位" prop="modify_unit" show-overflow-tooltip />
<el-table-column label="检查项" prop="check_item" show-overflow-tooltip />
<el-table-column label="质量隐患" prop="quality_hazards" show-overflow-tooltip />
<el-table-column label="检查结果" prop="check_result" show-overflow-tooltip />
<el-table-column label="操作" width="150" fixed="right">
<template #default="{ row }">
<el-button v-perms="['quality.quality_check/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['quality.quality_check/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<!-- <el-button v-perms="['quality.quality_check/detail']" link @click="handledetail(row)">
详情
</el-button> -->
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { qualitycheckLists, qualitycheckDelete, qualitycheckDetail } from '@/api/quality_check'
import { timeFormat } from '@/utils/util'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
//
const queryParams = reactive({
check_nature: '',
check_user: '',
check_unit: '',
modify_unit: '',
resp_user: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('refund_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: qualitycheckLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await qualitycheckDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await qualitycheckDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await qualitycheckDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
getLists()
</script>

View File

@ -0,0 +1,167 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="安全规范详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="12">
<el-form-item label="组织名称">
{{ formData.org_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="部门名称">
{{ formData.dept_name
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范名称">
{{ formData.name
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范类别">
{{ formData.type
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发布部门">
{{ formData.publish_dep
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范附件">
<div>
<div v-for="( item, index ) in formDataannex " style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
Object.assign(formData, data)
if (data.file && data.file.length > 0) {
if (data.file.includes(",")) {
const arry1 = data.file.split(',').map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
} else {
const arry1 = [{ name: `文件1`, uri: data.file }]
Object.assign(formDataannex, arry1)
console.log(formDataannex)
}
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,202 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="550px" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="24">
<el-form-item label="组织名称" prop="org_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.org_id" clearable placeholder="请选择组织" @change="deptrmt">
<el-option v-for="(item, index) in list1" :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="部门名称" prop="dept_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.dept_id" clearable placeholder="请选择部门">
<el-option v-for="( item, index ) in list2 " :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="检查性质名称" prop="name">
<el-input v-model="formData.name" clearable placeholder="请输入检查性质名称" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="创建人" prop="user">
<el-input v-model="formData.user" clearable placeholder="请输入创建人" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="说明" prop="illustrate">
<el-input v-model="formData.illustrate" type="textarea" clearable placeholder="请输入说明" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="创建日期" prop="date">
<el-date-picker v-model="formData.date" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择创建日期">
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="projectEdit">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { qualitychecknatureAdd, qualitychecknatureEdit, qualitychecknatureDetail } from '@/api/quality_check_nature'
import { toChinesNum } from "@/utils/util";
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
import { isEmail, isIdCard, isPhone } from '@/utils/validate'
import type { PropType } from 'vue'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const protype = reactive([])
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const list1 = reactive([])
const list2 = reactive([])
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
const userInfo = userStore.userInfo
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
//
const getlist = () => {
getAll().then((res) => {
Object.assign(list1, res)
})
}
//
const deptrmt = (e) => {
getlist1(e)
}
//
const getlist1 = (id: any) => {
deptAll({ 'org_id': id }).then((res) => {
Object.assign(list2, res)
})
}
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑检查性质表' : '新增检查性质表'
})
//
const formData = reactive({
id: '',
user: "",
illustrate: "",
date: '',
name: "",
dept_id: '',
org_id: "",
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
if (data.dept_id) {
getlist1(data.dept_id
)
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await qualitychecknatureDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await qualitychecknatureEdit(data)
: await qualitychecknatureAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getlist()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,145 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="检查性质名称" prop="name">
<el-input class="w-[280px]" v-model="queryParams.name" clearable placeholder="请输入检查性质名称" />
</el-form-item>
<el-form-item label="创建人" prop="user">
<el-input class="w-[280px]" v-model="queryParams.user" clearable placeholder="请输入发布部门" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['quality.quality_check_nature/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['quality.quality_check_nature/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="组织名称" prop="org_name" show-overflow-tooltip />
<el-table-column label="部门名称" prop="dept_name" show-overflow-tooltip />
<el-table-column label="检查性质名称" prop="name" show-overflow-tooltip />
<el-table-column label="创建人" prop="user" show-overflow-tooltip />
<el-table-column label="说明" prop="illustrate" show-overflow-tooltip />
<el-table-column label="创建日期" prop="date" show-overflow-tooltip />
<!-- <el-table-column label="规范附件" prop="file" show-overflow-tooltip /> -->
<el-table-column label="操作" width="150" fixed="right">
<template #default="{ row }">
<el-button v-perms="['quality.quality_check_nature/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['quality.quality_check_nature/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<!-- <el-button v-perms="['quality.quality_check_nature/detail']" link @click="handledetail(row)">
详情
</el-button> -->
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { qualitychecknatureLists, qualitychecknatureDelete, qualitychecknatureDetail } from '@/api/quality_check_nature'
import { timeFormat } from '@/utils/util'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
//
const queryParams = reactive({
user: '',
name: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('refund_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: qualitychecknatureLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await qualitychecknatureDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await qualitychecknatureDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await qualitychecknatureDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
getLists()
</script>

View File

@ -0,0 +1,167 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="安全规范详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="12">
<el-form-item label="组织名称">
{{ formData.org_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="部门名称">
{{ formData.dept_name
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范名称">
{{ formData.name
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范类别">
{{ formData.type
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发布部门">
{{ formData.publish_dep
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范附件">
<div>
<div v-for="( item, index ) in formDataannex " style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
Object.assign(formData, data)
if (data.file && data.file.length > 0) {
if (data.file.includes(",")) {
const arry1 = data.file.split(',').map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
} else {
const arry1 = [{ name: `文件1`, uri: data.file }]
Object.assign(formDataannex, arry1)
console.log(formDataannex)
}
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,355 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="组织名称" prop="org_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.org_id" clearable placeholder="请选择组织" @change="deptrmt">
<el-option v-for="(item, index) in list1" :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="部门名称" prop="dept_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.dept_id" clearable placeholder="请选择部门">
<el-option v-for="( item, index ) in list2 " :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="project_id" @click="showDialog = true">
<el-input v-model="project_name" clearable placeholder="请输入项目名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检测任务" prop="detection_task">
<el-input v-model="formData.detection_task" clearable placeholder="请输入检测任务" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="所属阶段" prop="owning_stage">
<el-input v-model="formData.owning_stage" clearable placeholder="请输入所属阶段" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="责任人" prop="resp_user">
<el-input v-model="formData.resp_user" clearable placeholder="请输入责任人" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="标准工期" prop="standard_duration">
<el-input v-model="formData.standard_duration" clearable placeholder="请输入标准工期" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="计划开始时间" prop="scheduled_start_time">
<el-date-picker v-model="formData.scheduled_start_time" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择计划开始时间">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="计划结束时间" prop="scheduled_end_time">
<el-date-picker v-model="formData.scheduled_end_time" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择计划结束时间">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否完成" prop="complete">
<el-input v-model="formData.complete" clearable placeholder="请输入是否完成" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="实际开始时间" prop="actual_start_time">
<el-date-picker v-model="formData.actual_start_time" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择实际开始时间">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="实际结束时间" prop="actual_end_time">
<el-date-picker v-model="formData.actual_end_time" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择实际结束时间">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="资料编号" prop="document_number">
<el-input v-model="formData.document_number" clearable placeholder="请输入资料编号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="资料名称" prop="document_name">
<el-input v-model="formData.document_name" clearable placeholder="请输入资料名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="文件稿本" prop="document_manuscript">
<el-input v-model="formData.document_manuscript" clearable placeholder="请输入文件稿本" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否归档" prop="archiving">
<el-input v-model="formData.archiving" clearable placeholder="请输入是否归档" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="资料内容要求" prop="data_content_requirements">
<el-input v-model="formData.data_content_requirements" clearable placeholder="请输入资料内容要求" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检测情况" prop="detection_situation">
<el-input v-model="formData.detection_situation" clearable placeholder="请输入检测情况" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" clearable type="textarea" placeholder="请输入备注" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附件" prop="field127">
<el-upload accept=".pdf" class="upload-demo" :show-file-list="false" aria-hidden="true" :headers="{ Token: userStore.token }" :action="base_url + '/upload/file'" :on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="( item, index ) in formDataannex " style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<porjectDialog @customEvent="customEvent"></porjectDialog>
</el-dialog>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="projectEdit">
import porjectDialog from '@/components/project/index.vue'
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { qualitydetectionAdd, qualitydetectionEdit, qualitydetectionDetail } from '@/api/quality_detection'
import { toChinesNum } from "@/utils/util";
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
import { isEmail, isIdCard, isPhone } from '@/utils/validate'
import type { PropType } from 'vue'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const protype = reactive([])
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const list1 = reactive([])
const list2 = reactive([])
const showDialog = ref(false)
const project_name = ref('')
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
const userInfo = userStore.userInfo
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
//
const customEvent = (e: any) => {
formData.project_id = e.id;
project_name.value = e.name;
showDialog.value = false;
};
//
const getlist = () => {
getAll().then((res) => {
Object.assign(list1, res)
})
}
//
const deptrmt = (e) => {
getlist1(e)
}
//
const getlist1 = (id: any) => {
deptAll({ 'org_id': id }).then((res) => {
Object.assign(list2, res)
})
}
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑质量检测表' : '新增质量检测表'
})
//
const formData = reactive({
id: '',
dept_id: '',
org_id: "",
project_id: "",
detection_task: "",
owning_stage: "",
resp_user: "",
standard_duration: "",
scheduled_start_time: "",
scheduled_end_time: "",
complete: "",
actual_start_time: "",
actual_end_time: "",
document_number: "",
document_name: "",
document_manuscript: "",
archiving: "",
data_content_requirements: "",
detection_situation: "",
remark: "",
file: "",
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.file && data.file.length > 0) {
if (data.file.includes(",")) {
const arry1 = data.file.split(',').map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
} else {
const arry1 = [{ name: `文件1`, uri: data.file }]
Object.assign(formDataannex, arry1)
console.log(formDataannex)
}
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
if (data.dept_id) {
getlist1(data.dept_id
)
}
project_name.value = data.project_name
}
const getDetail = async (row: Record<string, any>) => {
const data = await qualitydetectionDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.file = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await qualitydetectionEdit(data)
: await qualitydetectionAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getlist()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,170 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="检测任务" prop="detection_task">
<el-input class="w-[280px]" v-model="queryParams.detection_task" clearable placeholder="请输入检测任务" />
</el-form-item>
<el-form-item label="所属阶段" prop="owning_stage">
<el-input class="w-[280px]" v-model="queryParams.owning_stage" clearable placeholder="请输入所属阶段" />
</el-form-item>
<el-form-item label="责任人" prop="resp_user">
<el-input class="w-[280px]" v-model="queryParams.resp_user" clearable placeholder="请输入责任人" />
</el-form-item>
<el-form-item label="标准工期" prop="standard_duration">
<el-input class="w-[280px]" v-model="queryParams.standard_duration" clearable placeholder="请输入标准工期" />
</el-form-item>
<el-form-item label="资料编号" prop="document_number">
<el-input class="w-[280px]" v-model="queryParams.document_number" clearable placeholder="请输入资料编号" />
</el-form-item>
<el-form-item label="资料名称" prop="document_name">
<el-input class="w-[280px]" v-model="queryParams.document_name" clearable placeholder="请输入资料名称" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['quality.quality_detection/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['quality.quality_detection/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="组织名称" prop="org_name" show-overflow-tooltip />
<el-table-column label="部门名称" prop="dept_name" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="检测任务" prop="detection_task" show-overflow-tooltip />
<el-table-column label="所属阶段" prop="owning_stage" show-overflow-tooltip />
<el-table-column label="责任人" prop="resp_user" show-overflow-tooltip />
<el-table-column label="计划开始时间" prop="scheduled_start_time" show-overflow-tooltip />
<el-table-column label="计划结束时间" prop="scheduled_end_time" show-overflow-tooltip />
<el-table-column label="是否完成" prop="complete" show-overflow-tooltip />
<el-table-column label="实际开始时间" prop="actual_start_time" show-overflow-tooltip />
<el-table-column label="实际结束时间" prop="actual_end_time" show-overflow-tooltip />
<el-table-column label="资料编号" prop="document_number" show-overflow-tooltip />
<el-table-column label="资料名称" prop="document_name" show-overflow-tooltip />
<el-table-column label="文件稿本" prop="document_manuscript" show-overflow-tooltip />
<el-table-column label="是否归档" prop="archiving" show-overflow-tooltip />
<el-table-column label="资料内容要求" prop="data_content_requirements" show-overflow-tooltip />
<el-table-column label="检测情况" prop="detection_situation" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
<el-table-column label="附件" prop="file" show-overflow-tooltip />
<el-table-column label="操作" width="150" fixed="right">
<template #default="{ row }">
<el-button v-perms="['quality.quality_detection/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['quality.quality_detection/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<!-- <el-button v-perms="['quality.quality_detection/detail']" link @click="handledetail(row)">
详情
</el-button> -->
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { qualitydetectionLists, qualitydetectionDelete, qualitydetectionDetail } from '@/api/quality_detection'
import { timeFormat } from '@/utils/util'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
//
const queryParams = reactive({
standard_duration: '',
document_number: '',
document_name: '',
resp_user: '',
owning_stage: '',
detection_task: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('refund_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: qualitydetectionLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await qualitydetectionDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await qualitydetectionDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await qualitydetectionDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
getLists()
</script>

View File

@ -0,0 +1,167 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="安全规范详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="12">
<el-form-item label="组织名称">
{{ formData.org_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="部门名称">
{{ formData.dept_name
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范名称">
{{ formData.name
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范类别">
{{ formData.type
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发布部门">
{{ formData.publish_dep
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范附件">
<div>
<div v-for="( item, index ) in formDataannex " style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
Object.assign(formData, data)
if (data.file && data.file.length > 0) {
if (data.file.includes(",")) {
const arry1 = data.file.split(',').map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
} else {
const arry1 = [{ name: `文件1`, uri: data.file }]
Object.assign(formDataannex, arry1)
console.log(formDataannex)
}
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,260 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="550px" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="24">
<el-form-item label="组织名称" prop="org_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.org_id" clearable placeholder="请选择组织" @change="deptrmt">
<el-option v-for="(item, index) in list1" :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="部门名称" prop="dept_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.dept_id" clearable placeholder="请选择部门">
<el-option v-for="( item, index ) in list2 " :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="质量检测节点" prop="node">
<el-select class="flex-1" v-model="formData.node" clearable placeholder="请选择质量检测节点">
<el-option v-for="(item, index) in dictData.quality_detection_node" :key="index" :label="item.name" :value="parseInt(item.value)" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="序号" prop="serial_number">
<el-input v-model="formData.serial_number" clearable placeholder="请输入序号" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="标准工期" prop="standard_duration">
<el-input v-model="formData.standard_duration" clearable placeholder="请输入标准工期" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附件" prop="field127">
<el-upload accept=".pdf" class="upload-demo" :show-file-list="false" aria-hidden="true" :headers="{ Token: userStore.token }" :action="base_url + '/upload/file'" :on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="( item, index ) in formDataannex " style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="projectEdit">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { qualitydetectiontempAdd, qualitydetectiontempEdit, qualitydetectiontempDetail } from '@/api/quality_detection_temp'
import { toChinesNum } from "@/utils/util";
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
import { isEmail, isIdCard, isPhone } from '@/utils/validate'
import type { PropType } from 'vue'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const formDataannex = reactive([])
const list1 = reactive([])
const list2 = reactive([])
const project_name = ref('')
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
const userInfo = userStore.userInfo
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
//
const getlist = () => {
getAll().then((res) => {
Object.assign(list1, res)
})
}
//
const deptrmt = (e) => {
getlist1(e)
}
//
const getlist1 = (id: any) => {
deptAll({ 'org_id': id }).then((res) => {
Object.assign(list2, res)
})
}
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑质量检测模板表' : '新增质量检测模板表'
})
//
const formData = reactive({
id: '',
dept_id: '',
org_id: "",
node: "",
serial_number: "",
standard_duration: '',
file: '',
remark: "",
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.file && data.file.length > 0) {
if (data.file.includes(",")) {
const arry1 = data.file.split(',').map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
} else {
const arry1 = [{ name: `文件1`, uri: data.file }]
Object.assign(formDataannex, arry1)
console.log(formDataannex)
}
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
if (data.dept_id) {
getlist1(data.dept_id
)
}
project_name.value = data.project_name
}
const getDetail = async (row: Record<string, any>) => {
const data = await qualitydetectiontempDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.file = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await qualitydetectiontempEdit(data)
: await qualitydetectiontempAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getlist()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,150 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="序号" prop="serial_number">
<el-input class="w-[280px]" v-model="queryParams.serial_number" clearable placeholder="请输入序号" />
</el-form-item>
<el-form-item label="质量检测节点" prop="node">
<el-select v-model="queryParams.node" clearable placeholder="请选择质量检测节点">
<el-option v-for="(item, index) in dictData.quality_detection_node" :key="index" :label="item.name" :value="parseInt(item.value)" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['quality.quality_detection_temp/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['quality.quality_detection_temp/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="组织名称" prop="org_name" show-overflow-tooltip />
<el-table-column label="部门名称" prop="dept_name" show-overflow-tooltip />
<el-table-column label="质量检测节点" prop="project_name" show-overflow-tooltip>
<template #default="{ row }">
<dict-value :options="dictData.quality_detection_node" :value="row.node" />
</template>
</el-table-column>
<el-table-column label="序号" prop="serial_number" show-overflow-tooltip />
<el-table-column label="标准工期" prop="standard_duration" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
<el-table-column label="操作" width="150" fixed="right">
<template #default="{ row }">
<el-button v-perms="['quality.quality_detection_temp/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['quality.quality_detection_temp/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<!-- <el-button v-perms="['quality.quality_detection_temp/detail']" link @click="handledetail(row)">
详情
</el-button> -->
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { qualitydetectiontempLists, qualitydetectiontempDelete, qualitydetectiontempDetail } from '@/api/quality_detection_temp'
import { timeFormat } from '@/utils/util'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
//
const queryParams = reactive({
serial_number: '',
node: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('quality_detection_node')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: qualitydetectiontempLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = awaitqualitydetectiontempDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
awaitqualitydetectiontempDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = awaitqualitydetectiontempDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
getLists()
</script>

View File

@ -0,0 +1,167 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="安全规范详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="12">
<el-form-item label="组织名称">
{{ formData.org_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="部门名称">
{{ formData.dept_name
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范名称">
{{ formData.name
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范类别">
{{ formData.type
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发布部门">
{{ formData.publish_dep
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范附件">
<div>
<div v-for="( item, index ) in formDataannex " style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
Object.assign(formData, data)
if (data.file && data.file.length > 0) {
if (data.file.includes(",")) {
const arry1 = data.file.split(',').map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
} else {
const arry1 = [{ name: `文件1`, uri: data.file }]
Object.assign(formDataannex, arry1)
console.log(formDataannex)
}
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,280 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="550px" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="24">
<el-form-item label="组织名称" prop="org_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.org_id" clearable placeholder="请选择组织" @change="deptrmt">
<el-option v-for="(item, index) in list1" :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="部门名称" prop="dept_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.dept_id" clearable placeholder="请选择部门">
<el-option v-for="( item, index ) in list2 " :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="项目名称" prop="project_id" @click="showDialog = true">
<el-input v-model="project_name" clearable placeholder="请输入项目名称" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="事件名称" prop="name">
<el-input v-model="formData.name" clearable placeholder="请输入事件名称" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="事件类型" prop="type">
<el-input v-model="formData.type" clearable placeholder="请输入事件类型" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="发生时间" prop="happen_date">
<el-date-picker v-model="formData.happen_date" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择发生时间">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="内容" prop="content">
<el-input v-model="formData.content" type="textarea" clearable placeholder="请输入内容" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附件" prop="field127">
<el-upload accept=".pdf" class="upload-demo" :show-file-list="false" aria-hidden="true" :headers="{ Token: userStore.token }" :action="base_url + '/upload/file'" :on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="( item, index ) in formDataannex " style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<porjectDialog @customEvent="customEvent"></porjectDialog>
</el-dialog>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="projectEdit">
import porjectDialog from '@/components/project/index.vue'
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { qualityeventAdd, qualityeventEdit, qualityeventDetail } from '@/api/quality_event'
import { toChinesNum } from "@/utils/util";
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
import { isEmail, isIdCard, isPhone } from '@/utils/validate'
import type { PropType } from 'vue'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const protype = reactive([])
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const list1 = reactive([])
const list2 = reactive([])
const showDialog = ref(false)
const project_name = ref('')
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
const userInfo = userStore.userInfo
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
//
const customEvent = (e: any) => {
formData.project_id = e.id;
project_name.value = e.name;
showDialog.value = false;
};
//
const getlist = () => {
getAll().then((res) => {
Object.assign(list1, res)
})
}
//
const deptrmt = (e) => {
getlist1(e)
}
//
const getlist1 = (id: any) => {
deptAll({ 'org_id': id }).then((res) => {
Object.assign(list2, res)
})
}
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑质量事件表' : '新增质量事件表'
})
//
const formData = reactive({
id: '',
dept_id: '',
org_id: "",
project_id: "",
name: "",
type: "",
happen_date: '',
file: '',
content: "",
remark: "",
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.file && data.file.length > 0) {
if (data.file.includes(",")) {
const arry1 = data.file.split(',').map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
} else {
const arry1 = [{ name: `文件1`, uri: data.file }]
Object.assign(formDataannex, arry1)
console.log(formDataannex)
}
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
if (data.dept_id) {
getlist1(data.dept_id
)
}
project_name.value = data.project_name
}
const getDetail = async (row: Record<string, any>) => {
const data = await qualityeventDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.file = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await qualityeventEdit(data)
: await qualityeventAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getlist()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,147 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="事件名称" prop="name">
<el-input class="w-[280px]" v-model="queryParams.name" clearable placeholder="请输入事件名称" />
</el-form-item>
<el-form-item label="事件类型" prop="type">
<el-input class="w-[280px]" v-model="queryParams.type" clearable placeholder="请输入事件类型" />
</el-form-item>
<el-form-item label="发生日期" prop="happen_date">
<el-date-picker class="w-[280px]" v-model="queryParams.happen_date" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择发生时间">
</el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['quality.quality_event/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['quality.quality_event/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="组织名称" prop="org_name" show-overflow-tooltip />
<el-table-column label="部门名称" prop="dept_name" show-overflow-tooltip />
<el-table-column label="事件名称" prop="name" show-overflow-tooltip />
<el-table-column label="事件类型" prop="type" show-overflow-tooltip />
<el-table-column label="发生日期" prop="happen_date" show-overflow-tooltip />
<el-table-column label="内容" prop="content" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
<el-table-column label="附件" prop="file" show-overflow-tooltip />
<el-table-column label="操作" width="150" fixed="right">
<template #default="{ row }">
<el-button v-perms="['quality.quality_event/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['quality.quality_event/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<!-- <el-button v-perms="['quality.quality_event/detail']" link @click="handledetail(row)">
详情
</el-button> -->
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { qualityeventLists, qualityeventDelete, qualityeventDetail } from '@/api/quality_event'
import { timeFormat } from '@/utils/util'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
//
const queryParams = reactive({
happen_date: '',
name: '',
type: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('refund_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: qualityeventLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await qualityeventDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await qualityeventDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await qualityeventDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
getLists()
</script>

View File

@ -0,0 +1,167 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="安全规范详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="12">
<el-form-item label="组织名称">
{{ formData.org_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="部门名称">
{{ formData.dept_name
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范名称">
{{ formData.name
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范类别">
{{ formData.type
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发布部门">
{{ formData.publish_dep
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范附件">
<div>
<div v-for="( item, index ) in formDataannex " style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
Object.assign(formData, data)
if (data.file && data.file.length > 0) {
if (data.file.includes(",")) {
const arry1 = data.file.split(',').map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
} else {
const arry1 = [{ name: `文件1`, uri: data.file }]
Object.assign(formDataannex, arry1)
console.log(formDataannex)
}
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,278 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="550px" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="24">
<el-form-item label="组织名称" prop="org_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.org_id" clearable placeholder="请选择组织" @change="deptrmt">
<el-option v-for="(item, index) in list1" :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="部门名称" prop="dept_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.dept_id" clearable placeholder="请选择部门">
<el-option v-for="( item, index ) in list2 " :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="工程名称" prop="project_id" @click="showDialog = true">
<el-input v-model="project_name" clearable placeholder="请输入工程名称" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="目标" prop="target">
<el-input v-model="formData.target" clearable placeholder="请输入目标" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="基本要求" prop="basic_requirements">
<el-input v-model="formData.basic_requirements" clearable placeholder="请输入基本要求" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="目标规范" prop="target_specification">
<el-input v-model="formData.target_specification" type="textarea" clearable placeholder="请输入目标规范" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="合格率" prop="pass_rate">
<el-input v-model="formData.pass_rate" type="number" clearable placeholder="请输入合格率" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="允许偏差" prop="allowable_deviation">
<el-input v-model="formData.allowable_deviation" type="number" clearable placeholder="请输入允许偏差" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附件" prop="field127">
<el-upload accept=".pdf" class="upload-demo" :show-file-list="false" aria-hidden="true" :headers="{ Token: userStore.token }" :action="base_url + '/upload/file'" :on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="( item, index ) in formDataannex " style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<porjectDialog @customEvent="customEvent"></porjectDialog>
</el-dialog>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="projectEdit">
import porjectDialog from '@/components/project/index.vue'
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { qualitymboAdd, qualitymboEdit, qualitymboDetail } from '@/api/quality_mbo'
import { toChinesNum } from "@/utils/util";
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
import { isEmail, isIdCard, isPhone } from '@/utils/validate'
import type { PropType } from 'vue'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const protype = reactive([])
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const list1 = reactive([])
const list2 = reactive([])
const showDialog = ref(false)
const project_name = ref('')
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
const userInfo = userStore.userInfo
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
//
const customEvent = (e: any) => {
formData.project_id = e.id;
project_name.value = e.name;
showDialog.value = false;
};
//
const getlist = () => {
getAll().then((res) => {
Object.assign(list1, res)
})
}
//
const deptrmt = (e) => {
getlist1(e)
}
//
const getlist1 = (id: any) => {
deptAll({ 'org_id': id }).then((res) => {
Object.assign(list2, res)
})
}
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑质量目标表' : '新增质量目标表'
})
//
const formData = reactive({
id: '',
dept_id: '',
org_id: "",
project_id: "",
target: "",
basic_requirements: "",
target_specification: '',
file: '',
allowable_deviation: "",
pass_rate: "",
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.file && data.file.length > 0) {
if (data.file.includes(",")) {
const arry1 = data.file.split(',').map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
} else {
const arry1 = [{ name: `文件1`, uri: data.file }]
Object.assign(formDataannex, arry1)
console.log(formDataannex)
}
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
if (data.dept_id) {
getlist1(data.dept_id
)
}
project_name.value = data.project_name
}
const getDetail = async (row: Record<string, any>) => {
const data = await qualitymboDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.file = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await qualitymboEdit(data)
: await qualitymboAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getlist()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,137 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="目标" prop="target">
<el-input class="w-[280px]" v-model="queryParams.target" clearable placeholder="请输入目标" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['quality.quality_mbo/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['quality.quality_mbo/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="组织名称" prop="org_name" show-overflow-tooltip />
<el-table-column label="部门名称" prop="dept_name" show-overflow-tooltip />
<el-table-column label="工程名称" prop="target" show-overflow-tooltip />
<el-table-column label="合格率" prop="pass_rate" show-overflow-tooltip />
<el-table-column label="目标规范" prop="target_specification" show-overflow-tooltip />
<el-table-column label="基本要求" prop="basic_requirements" show-overflow-tooltip />
<el-table-column label="允许偏差" prop="allowable_deviation" show-overflow-tooltip />
<el-table-column label="附件" prop="file" show-overflow-tooltip />
<el-table-column label="操作" width="150" fixed="right">
<template #default="{ row }">
<el-button v-perms="['quality.quality_mbo/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['quality.quality_mbo/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<!-- <el-button v-perms="['quality.quality_mbo/detail']" link @click="handledetail(row)">
详情
</el-button> -->
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { qualitymboLists, qualitymboDelete, qualitymboDetail } from '@/api/quality_mbo'
import { timeFormat } from '@/utils/util'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
//
const queryParams = reactive({
target: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('refund_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: qualitymboLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await qualitymboDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await qualitymboDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await qualitymboDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
getLists()
</script>

View File

@ -0,0 +1,167 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="安全规范详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="12">
<el-form-item label="组织名称">
{{ formData.org_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="部门名称">
{{ formData.dept_name
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范名称">
{{ formData.name
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范类别">
{{ formData.type
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发布部门">
{{ formData.publish_dep
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范附件">
<div>
<div v-for="( item, index ) in formDataannex " style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
Object.assign(formData, data)
if (data.file && data.file.length > 0) {
if (data.file.includes(",")) {
const arry1 = data.file.split(',').map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
} else {
const arry1 = [{ name: `文件1`, uri: data.file }]
Object.assign(formDataannex, arry1)
console.log(formDataannex)
}
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,290 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="组织名称" prop="org_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.org_id" clearable placeholder="请选择组织" @change="deptrmt">
<el-option v-for="(item, index) in list1" :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="部门名称" prop="dept_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.dept_id" clearable placeholder="请选择部门">
<el-option v-for="( item, index ) in list2 " :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="project_id" @click="showDialog = true">
<el-input v-model="project_name" clearable placeholder="请输入项目名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码" prop="project_id" @click="showDialog = true">
<el-input v-model="project_code" clearable placeholder="请输入项目编码" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查性质" prop="check_nature">
<el-input v-model="formData.check_nature" clearable placeholder="请输入检查性质" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查日期" prop="check_date">
<el-date-picker class="flex-1 !flex" v-model="formData.check_date" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择检查日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="整改期限" prop="modify_term">
<el-input v-model="formData.modify_term" clearable placeholder="请输入整改期限" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查人" prop="check_user">
<el-input v-model="formData.check_user" clearable placeholder="请输入检查人" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查单位" prop="check_unit">
<el-input v-model="formData.check_unit" clearable placeholder="请输入检查单位" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="整改单位" prop="modify_unit">
<el-input v-model="formData.modify_unit" clearable placeholder="请输入整改单位" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="责任人" prop="resp_user">
<el-input v-model="formData.resp_user" clearable placeholder="请输入责任人" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="抄送人" prop="copy_user">
<el-input v-model="formData.copy_user" clearable placeholder="请输入抄送人" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查项" prop="check_item">
<el-input v-model="formData.check_item" clearable placeholder="请输入检查项" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="质量隐患" prop="quality_hazards">
<el-input v-model="formData.quality_hazards" clearable placeholder="请输入质量隐患" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查结果" prop="check_result">
<el-input v-model="formData.check_result" clearable placeholder="请输入检查结果" />
</el-form-item>
</el-col>
</el-row>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<porjectDialog @customEvent="customEvent"></porjectDialog>
</el-dialog>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="projectEdit">
import porjectDialog from '@/components/project/index.vue'
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { qualitymodifyAdd, qualitymodifyEdit, qualitymodifyDetail } from '@/api/quality_modify'
import { toChinesNum } from "@/utils/util";
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
import { isEmail, isIdCard, isPhone } from '@/utils/validate'
import type { PropType } from 'vue'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const protype = reactive([])
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const list1 = reactive([])
const list2 = reactive([])
const showDialog = ref(false)
const project_name = ref('')
const project_code = ref('')
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
const userInfo = userStore.userInfo
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
//
const customEvent = (e: any) => {
formData.project_id = e.id;
project_name.value = e.name;
project_code.value = e.project_code
showDialog.value = false;
};
//
const getlist = () => {
getAll().then((res) => {
Object.assign(list1, res)
})
}
//
const deptrmt = (e) => {
getlist1(e)
}
//
const getlist1 = (id: any) => {
deptAll({ 'org_id': id }).then((res) => {
Object.assign(list2, res)
})
}
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑质量整改表' : '新增质量整改表'
})
//
const formData = reactive({
id: '',
org_id: '',
dept_id: '',
project_id: '',
check_date: '',
check_user: '',
check_unit: '',
check_item: '',
check_result: '',
modify_unit: '',
resp_user: '',
modify_term: '',
copy_user: '',
check_nature: '',
quality_hazards: '',
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
if (data.dept_id) {
getlist1(data.dept_id
)
}
project_name.value = data.project_name
project_code.value = data.project_code
}
const getDetail = async (row: Record<string, any>) => {
const data = await qualitymodifyDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await qualitymodifyEdit(data)
: await qualitymodifyAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getlist()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,160 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline label-width="auto">
<el-form-item label="检查性质" prop="check_nature">
<el-input class="w-[280px]" v-model="queryParams.check_nature" clearable placeholder="请输入检查性质" />
</el-form-item>
<el-form-item label="检查人" prop="check_user">
<el-input class="w-[280px]" v-model="queryParams.check_user" clearable placeholder="请输入检查人" />
</el-form-item>
<el-form-item label="检查单位" prop="check_unit">
<el-input class="w-[280px]" v-model="queryParams.check_unit" clearable placeholder="请输入检查单位" />
</el-form-item>
<el-form-item label="整改单位" prop="modify_unit">
<el-input class="w-[280px]" v-model="queryParams.modify_unit" clearable placeholder="请输入整改单位" />
</el-form-item>
<el-form-item label="责任人" prop="resp_user">
<el-input class="w-[280px]" v-model="queryParams.resp_user" clearable placeholder="请输入责任人" />
</el-form-item>
<el-form-item label="抄送人" prop="resp_user">
<el-input class="w-[280px]" v-model="queryParams.copy_user" clearable placeholder="请输入抄送人" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['quality.quality_modify/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['quality.quality_modify/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="组织名称" prop="org_name" show-overflow-tooltip />
<el-table-column label="部门名称" prop="dept_name" show-overflow-tooltip />
<el-table-column label="检查性质" prop="check_nature" show-overflow-tooltip />
<el-table-column label="检查日期" prop="check_date" show-overflow-tooltip />
<el-table-column label="整改期限" prop="modify_term" show-overflow-tooltip />
<el-table-column label="检查人" prop="check_user" show-overflow-tooltip />
<el-table-column label="抄送人" prop="copy_user" show-overflow-tooltip />
<el-table-column label="检查单位" prop="check_unit" show-overflow-tooltip />
<el-table-column label="整改单位" prop="modify_unit" show-overflow-tooltip />
<el-table-column label="检查项" prop="check_item" show-overflow-tooltip />
<el-table-column label="质量隐患" prop="quality_hazards" show-overflow-tooltip />
<el-table-column label="检查结果" prop="check_result" show-overflow-tooltip />
<el-table-column label="操作" width="150" fixed="right">
<template #default="{ row }">
<el-button v-perms="['quality.quality_modify/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['quality.quality_modify/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<!-- <el-button v-perms="['quality.quality_modify/detail']" link @click="handledetail(row)">
详情
</el-button> -->
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { qualitymodifyLists, qualitymodifyDelete, qualitymodifyDetail } from '@/api/quality_modify'
import { timeFormat } from '@/utils/util'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
//
const queryParams = reactive({
check_nature: '',
check_user: '',
check_unit: '',
modify_unit: '',
resp_user: '',
copy_user: ''
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('refund_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: qualitymodifyLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await qualitymodifyDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await qualitymodifyDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await qualitymodifyDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
getLists()
</script>

View File

@ -0,0 +1,167 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="安全规范详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="12">
<el-form-item label="组织名称">
{{ formData.org_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="部门名称">
{{ formData.dept_name
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范名称">
{{ formData.name
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范类别">
{{ formData.type
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发布部门">
{{ formData.publish_dep
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范附件">
<div>
<div v-for="( item, index ) in formDataannex " style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
Object.assign(formData, data)
if (data.file && data.file.length > 0) {
if (data.file.includes(",")) {
const arry1 = data.file.split(',').map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
} else {
const arry1 = [{ name: `文件1`, uri: data.file }]
Object.assign(formDataannex, arry1)
console.log(formDataannex)
}
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,207 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="550px" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="24">
<el-form-item label="组织名称" prop="org_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.org_id" clearable placeholder="请选择组织" @change="deptrmt">
<el-option v-for="(item, index) in list1" :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="部门名称" prop="dept_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.dept_id" clearable placeholder="请选择部门">
<el-option v-for="( item, index ) in list2 " :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="分类名称" prop="classify_name" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="formData.classify_name" clearable placeholder="请输入分类名称" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="projectEdit">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { professionalcategoryAdd, professionalcategoryEdit, professionalcategoryDetail } from '@/api/quality_professional_category'
import { toChinesNum } from "@/utils/util";
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
import { isEmail, isIdCard, isPhone } from '@/utils/validate'
import type { PropType } from 'vue'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const protype = reactive([])
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const list1 = reactive([])
const list2 = reactive([])
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
const userInfo = userStore.userInfo
console.log(userInfo, '222222')
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
//
const getlist = () => {
getAll().then((res) => {
Object.assign(list1, res)
})
}
//
const deptrmt = (e) => {
getlist1(e)
}
//
const getlist1 = (id: any) => {
deptAll({ 'org_id': id }).then((res) => {
Object.assign(list2, res)
})
}
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑专业类别表' : '新增专业类别表'
})
//
const formData = reactive({
id: '',
remark: "",
classify_name: "",
dept_id: '',
org_id: "",
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
if (data.dept_id) {
getlist1(data.dept_id
)
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await professionalcategoryDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await professionalcategoryEdit(data)
: await professionalcategoryAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getlist()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,138 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="分类名" prop="classify_name">
<el-input class="w-[280px]" v-model="queryParams.classify_name" clearable placeholder="请输入分类名" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['quality.quality_professional_category/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['quality.quality_professional_category/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="组织名称" prop="org_name" show-overflow-tooltip />
<el-table-column label="部门名称" prop="dept_name" show-overflow-tooltip />
<el-table-column label="分类名" prop="classify_name" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
<el-table-column label="操作" width="150" fixed="right">
<template #default="{ row }">
<el-button v-perms="['quality.quality_professional_category/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['quality.quality_professional_category/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<!-- <el-button v-perms="['quality.quality_professional_category/detail']" link @click="handledetail(row)">
详情
</el-button> -->
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { professionalcategoryLists, professionalcategoryDelete, professionalcategoryDetail } from '@/api/quality_professional_category'
import { timeFormat } from '@/utils/util'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
//
const queryParams = reactive({
classify_name: ''
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('refund_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: professionalcategoryLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await professionalcategoryDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await professionalcategoryDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await professionalcategoryDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
getLists()
</script>

View File

@ -0,0 +1,167 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="安全规范详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="12">
<el-form-item label="组织名称">
{{ formData.org_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="部门名称">
{{ formData.dept_name
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范名称">
{{ formData.name
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范类别">
{{ formData.type
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发布部门">
{{ formData.publish_dep
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范附件">
<div>
<div v-for="( item, index ) in formDataannex " style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
Object.assign(formData, data)
if (data.file && data.file.length > 0) {
if (data.file.includes(",")) {
const arry1 = data.file.split(',').map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
} else {
const arry1 = [{ name: `文件1`, uri: data.file }]
Object.assign(formDataannex, arry1)
console.log(formDataannex)
}
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,261 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="550px" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="24">
<el-form-item label="组织名称" prop="org_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.org_id" clearable placeholder="请选择组织" @change="deptrmt">
<el-option v-for="(item, index) in list1" :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="部门名称" prop="dept_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.dept_id" clearable placeholder="请选择部门">
<el-option v-for="( item, index ) in list2 " :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="规范名称" prop="name">
<el-input v-model="formData.name" clearable placeholder="请输入规范名称" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="规范类别" prop="type">
<el-input v-model="formData.type" clearable placeholder="请输入规范类别" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="发布部门" prop="release_dept">
<el-input v-model="formData.release_dept" clearable placeholder="请输入发布部门" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="发布时间" prop="release_date">
<el-date-picker v-model="formData.release_date" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择发布时间">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="内容" prop="content">
<el-input v-model="formData.content" type="textarea" clearable placeholder="请输入内容" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附件" prop="field127">
<el-upload accept=".pdf" class="upload-demo" :show-file-list="false" aria-hidden="true" :headers="{ Token: userStore.token }" :action="base_url + '/upload/file'" :on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="( item, index ) in formDataannex " style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="projectEdit">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { qualityspecificationAdd, qualityspecificationEdit, qualityspecificationDetail } from '@/api/quality_specification'
import { toChinesNum } from "@/utils/util";
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
import { isEmail, isIdCard, isPhone } from '@/utils/validate'
import type { PropType } from 'vue'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const protype = reactive([])
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const list1 = reactive([])
const list2 = reactive([])
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
const userInfo = userStore.userInfo
console.log(userInfo, '222222')
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
//
const getlist = () => {
getAll().then((res) => {
Object.assign(list1, res)
})
}
//
const deptrmt = (e) => {
getlist1(e)
}
//
const getlist1 = (id: any) => {
deptAll({ 'org_id': id }).then((res) => {
Object.assign(list2, res)
})
}
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑质量规范表' : '新增质量规范表'
})
//
const formData = reactive({
id: '',
release_dept: "",
content: "",
file: '',
name: "",
type: "",
release_date: "",
dept_id: '',
org_id: "",
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.file && data.file.length > 0) {
if (data.file.includes(",")) {
const arry1 = data.file.split(',').map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
} else {
const arry1 = [{ name: `文件1`, uri: data.file }]
Object.assign(formDataannex, arry1)
console.log(formDataannex)
}
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
if (data.dept_id) {
getlist1(data.dept_id
)
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await qualityspecificationDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.file = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await qualityspecificationEdit(data)
: await qualityspecificationAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getlist()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,145 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="规范类别" prop="type">
<el-input class="w-[280px]" v-model="queryParams.type" clearable placeholder="请输入规范类别" />
</el-form-item>
<el-form-item label="规范名称" prop="name">
<el-input class="w-[280px]" v-model="queryParams.name" clearable placeholder="请输入规范名称" />
</el-form-item>
<el-form-item label="发布部门" prop="release_dept">
<el-input class="w-[280px]" v-model="queryParams.release_dept" clearable placeholder="请输入发布部门" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['quality.quality_specification/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['quality.quality_specification/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="组织名称" prop="org_name" show-overflow-tooltip />
<el-table-column label="部门名称" prop="dept_name" show-overflow-tooltip />
<el-table-column label="规范名称" prop="name" show-overflow-tooltip />
<el-table-column label="规范类别" prop="type" show-overflow-tooltip />
<el-table-column label="发布部门" prop="release_dept" show-overflow-tooltip />
<el-table-column label="发布时间" prop="release_date" show-overflow-tooltip />
<el-table-column label="内容" prop="content" show-overflow-tooltip />
<el-table-column label="规范附件" prop="file" show-overflow-tooltip />
<el-table-column label="操作" width="150" fixed="right">
<template #default="{ row }">
<el-button v-perms="['quality.quality_specification/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['quality.quality_specification/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<!-- <el-button v-perms="['quality.quality_specification/detail']" link @click="handledetail(row)">
详情
</el-button> -->
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { qualityspecificationLists, qualityspecificationDelete, qualityspecificationDetail } from '@/api/quality_specification'
import { timeFormat } from '@/utils/util'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
//
const queryParams = reactive({
release_dept: '',
name: '',
type: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('refund_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: qualityspecificationLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await qualityspecificationDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await qualityspecificationDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await qualityspecificationDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
getLists()
</script>

View File

@ -0,0 +1,167 @@
<template>
<div class="detail-popup">
<popup ref="popupRef" title="安全规范详情" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="160px">
<el-card class="mb-2">
<el-row>
<el-col :span="12">
<el-form-item label="组织名称">
{{ formData.org_name }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="部门名称">
{{ formData.dept_name
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范名称">
{{ formData.name
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范类别">
{{ formData.type
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发布部门">
{{ formData.publish_dep
}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="内容">
{{ formData.content }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规范附件">
<div>
<div v-for="( item, index ) in formDataannex " style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="customdetail">
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { apiCustomDetail } from '@/api/custom'
import { timeFormat } from '@/utils/util'
import type { PropType } from 'vue'
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const formDataannex = reactive([])
const datas = reactive({
provinceOptions: [],
cityOptions: [],
areaOptions: [],
});
//
const formData = reactive({
})
//
const setFormData = async (data: Record<any, any>) => {
Object.assign(formData, data)
if (data.file && data.file.length > 0) {
if (data.file.includes(",")) {
const arry1 = data.file.split(',').map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
} else {
const arry1 = [{ name: `文件1`, uri: data.file }]
Object.assign(formDataannex, arry1)
console.log(formDataannex)
}
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await apiCustomDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
popupRef.value?.close()
}
//
const open = () => {
console.log('1111111')
popupRef.value?.open()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>
<style lang="scss">
.tit {
font-size: 1.2em;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,266 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="550px" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="24">
<el-form-item label="组织名称" prop="org_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.org_id" clearable placeholder="请选择组织" @change="deptrmt">
<el-option v-for="(item, index) in list1" :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="部门名称" prop="dept_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.dept_id" clearable placeholder="请选择部门">
<el-option v-for="( item, index ) in list2 " :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="名称" prop="project_name" @click="showDialog = true">
<el-input v-model="project_name" readonly clearable placeholder="请输入项目名称" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="发生日期" prop="happen_date">
<el-date-picker class="flex-1 !flex" v-model="formData.happen_date" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择发生日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="内容" prop="content">
<el-input v-model="formData.content" clearable placeholder="请输入内容" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附件" prop="field127">
<el-upload accept=".pdf" class="upload-demo" :show-file-list="false" aria-hidden="true" :headers="{ Token: userStore.token }" :action="base_url + '/upload/file'" :on-success="handleAvatarSuccess_four" ref="upload">
<el-button type="primary">
上传
</el-button>
</el-upload>
<div>
<div v-for="( item, index ) in formDataannex " style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<porjectDialog @customEvent="customEvent"></porjectDialog>
</el-dialog>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="projectEdit">
import porjectDialog from '@/components/project/index.vue'
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import { qualitysuperviseAdd, qualitysuperviseEdit, qualitysuperviseDetail } from '@/api/quality_supervise'
import { toChinesNum } from "@/utils/util";
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
import { isEmail, isIdCard, isPhone } from '@/utils/validate'
import type { PropType } from 'vue'
import configs from "@/config"
import useUserStore from "@/stores/modules/user";
const protype = reactive([])
const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const list1 = reactive([])
const list2 = reactive([])
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
const userInfo = userStore.userInfo
console.log(userInfo, '222222')
const showDialog = ref(false)
const project_name = ref('')
//
const handleAvatarSuccess_four = (
response,
uploadFile
) => {
if (response.code == 0) {
ElMessage.error(response.msg);
return;
}
formDataannex.push(
{ uri: response.data.uri, name: response.data.name }
);
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
}
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({})
}
})
const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
//
const customEvent = (e: any) => {
formData.project_id = e.id;
project_name.value = e.name;
showDialog.value = false;
};
//
const getlist = () => {
getAll().then((res) => {
Object.assign(list1, res)
})
}
//
const deptrmt = (e) => {
getlist1(e)
}
//
const getlist1 = (id: any) => {
deptAll({ 'org_id': id }).then((res) => {
Object.assign(list2, res)
})
}
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑质量监督表' : '新增质量监督表'
})
//
const formData = reactive({
id: '',
project_id: "",
happen_date: "",
file: '',
content: "",
remark: "",
dept_id: '',
org_id: "",
})
//
const formRules = reactive<any>({
})
//
const setFormData = async (data: Record<any, any>) => {
if (data.file && data.file.length > 0) {
if (data.file.includes(",")) {
const arry1 = data.file.split(',').map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
};
});
Object.assign(formDataannex, arry1)
} else {
const arry1 = [{ name: `文件1`, uri: data.file }]
Object.assign(formDataannex, arry1)
console.log(formDataannex)
}
}
project_name.value = data.project_name;
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
if (data.dept_id) {
getlist1(data.dept_id
)
}
}
const getDetail = async (row: Record<string, any>) => {
const data = await qualitysuperviseDetail({
id: row.id
})
setFormData(data)
}
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.file = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await qualitysuperviseEdit(data)
: await qualitysuperviseAdd(data)
popupRef.value?.close()
emit('success')
}
//
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getlist()
}
//
const handleClose = () => {
emit('close')
}
defineExpose({
open,
setFormData,
getDetail
})
</script>

View File

@ -0,0 +1,141 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="发生日期" prop="type">
<el-date-picker class="flex-1 !flex" v-model="queryParams.happen_date" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择发生日期">
</el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['safety.safety_standard/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['safety.safety_standard/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="组织名称" prop="org_name" show-overflow-tooltip />
<el-table-column label="部门名称" prop="dept_name" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="发生日期" prop="happen_date" show-overflow-tooltip />
<el-table-column label="内容" prop="content" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
<el-table-column label="规范附件" prop="file" show-overflow-tooltip />
<el-table-column label="操作" width="150" fixed="right">
<template #default="{ row }">
<el-button v-perms="['safety.safety_standard/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['safety.safety_standard/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<!-- <el-button v-perms="['safety.safety_standard/detail']" link @click="handledetail(row)">
详情
</el-button> -->
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { qualitysuperviseLists, qualitysuperviseDelete, qualitysuperviseDetail } from '@/api/quality_supervise'
import { timeFormat } from '@/utils/util'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
//
const showEdit = ref(false)
const showDtail = ref(false)
//
const queryParams = reactive({
happen_date: '',
})
//
const selectData = ref<any[]>([])
//
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
//
const { dictData } = useDictData('refund_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: qualitysuperviseLists,
params: queryParams
})
//
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await qualitysuperviseDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await qualitysuperviseDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await qualitysuperviseDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
getLists()
</script>

View File

@ -1,84 +1,87 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-steps :active="active" align-center style="margin-bottom: 20px;">
<el-step title="商务部发起" />
<el-step title="商务总监" />
<el-step title="财务经理" />
<el-step title="总经理" />
</el-steps>
<popup ref="popupRef" :title="popupTitle" :async="true" width="550px" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="客户名称" prop="customer_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="custom_name" @click="showDialog = true" clearable placeholder="请选择客户" />
<el-col :span="24">
<el-form-item label="组织名称" prop="org_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.org_id" clearable placeholder="请选择组织" @change="deptrmt">
<el-option v-for="(item, index) in list1" :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款日期" prop="return_date">
<el-date-picker class="flex-1 !flex" v-model="formData.return_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择日期">
</el-date-picker>
<el-col :span="24">
<el-form-item label="部门名称" prop="dept_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.dept_id" clearable placeholder="请选择部门">
<el-option v-for="( item, index ) in list2 " :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="contract_id" @click="showDialog1 = true">
<el-col :span="24">
<el-form-item label="项目名称" prop="project_id" @click="showDialog = true">
<el-input v-model="project_name" clearable placeholder="请输入项目名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码" prop="contract_id">
<el-col :span="24">
<el-form-item label="项目编码" prop="project_id" @click="showDialog = true">
<el-input v-model="project_code" clearable placeholder="请输入项目编码" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号" prop="contract_no">
<el-input v-model="contract_no" clearable placeholder="请输入合同编号" />
<el-col :span="24">
<el-form-item label="事故名称" prop="name">
<el-input v-model="formData.name" clearable placeholder="请输入事件名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称" prop="contract_name">
<el-input v-model="contract_name" clearable placeholder="请输入合同名称" />
<el-col :span="24">
<el-form-item label="事故类型" prop="type">
<el-input v-model="formData.type" clearable placeholder="请输入事故类型" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款原因" prop="reason">
<el-input v-model="formData.reason" type='textarea' clearable placeholder="请输入退款原因" />
<el-col :span="24">
<el-form-item label="发生时间" prop="require">
<el-date-picker class="flex-1 !flex" v-model="formData.happen_time" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择发生时间">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款金额" prop="amount">
<el-input v-model="formData.amount" clearable placeholder="请输入退款金额" @input="amountinput" />
<el-col :span="24">
<el-form-item label="设备事故" prop="device_accident">
<el-input v-model="formData.device_accident" clearable placeholder="请输入设备事故" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写" prop="amount_daxie">
<el-input v-model="formData.amount_daxie" readonly clearable placeholder="请输入金额大写" />
<el-col :span="24">
<el-form-item label="承包商人员" prop="contractor_user">
<el-input v-model="formData.contractor_user" clearable placeholder="请输入承包商人员" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款方式" prop="contacts">
<el-select class="flex-1" v-model="formData.refund_type" clearable placeholder="请选择退款方式">
<el-option v-for="(item, index) in dictData.refund_type" :key="index" :label="item.name" :value="parseInt(item.value)" />
</el-select>
<el-col :span="24">
<el-form-item label="非本企业人员" prop="our_company_user">
<el-input v-model="formData.our_company_user" clearable placeholder="请输入非本企业人员" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款人" prop="refunder">
<el-input v-model="formData.refunder" readonly clearable placeholder="请输入退款人" />
<el-col :span="24">
<el-form-item label="本企业人员" prop="not_our_company_user">
<el-input v-model="formData.not_our_company_user" clearable placeholder="请输入本企业人员" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="24">
<el-form-item label="内容" prop="content">
<el-input v-model="formData.content" type="textarea" clearable placeholder="请输入内容" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附件" prop="field127">
@ -89,7 +92,7 @@
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<div v-for="( item, index ) in formDataannex " style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
@ -98,34 +101,11 @@
</el-form-item>
</el-col>
</el-row>
<div style="margin: 20px 0;">客户收款信息</div>
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="收款账号" prop="collection_acccount" @click="showDialog2 = true">
<el-input v-model="formData.collection_acccount" clearable placeholder="请输入收款账号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收款银行" prop="collection_bank">
<el-input v-model="formData.collection_bank" clearable placeholder="请输入收款银行" />
</el-form-item>
</el-col>
</el-row>
<el-dialog v-model="showDialog" title="选择客户" width="70%">
<customDialog @customEvent="customEvent"></customDialog>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<porjectDialog @customEvent="customEvent"></porjectDialog>
</el-dialog>
<el-dialog v-model="showDialog1" title="选择合同" width="70%">
<salescontractDialog @customEvent="customEvent1"></salescontractDialog>
</el-dialog>
</el-form>
@ -135,12 +115,10 @@
</template>
<script lang="ts" setup name="projectEdit">
import customDialog from '@/components/custom-dialog/index.vue'
import porjectDialog from '@/components/project/index.vue'
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import salescontractDialog from '@/components/salescontract/index.vue'
import { apirefundapplyAdd, apirefundapplyEdit, apirefundapplyDetail } from '@/api/refund'
import { safetyaccidentAdd, safetyaccidentEdit, safetyaccidentDetail } from '@/api/safety_accident'
import { toChinesNum } from "@/utils/util";
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
@ -153,14 +131,14 @@ const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const contract_name = ref('')
const list1 = reactive([])
const list2 = reactive([])
const showDialog = ref(false)
const project_name = ref('')
const project_code = ref('')
const project_amount = ref('')
const contract_no = ref('')
const custom_name = ref('')
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
const userInfo = userStore.userInfo
console.log(userInfo, '222222')
//
const handleAvatarSuccess_four = (
response,
@ -176,31 +154,7 @@ const handleAvatarSuccess_four = (
);
};
//
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
if (value && !/^1\d{10}$/.test(value)) {
callback(new Error('请输入正确的手机号码'));
} else {
callback()
}
}
const userEmail = (rule: any, value: string, callback: (arg0: Error | undefined) => void) => {
// const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
// // if (!value) {
// // return callback(new Error(''))
// // }
if (value && !mailReg.test(value)) {
callback(new Error('请输入正确的邮箱格式'))
} else {
callback()
}
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
@ -215,54 +169,53 @@ const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const amount_daxie = ref('')
const showDialog = ref(false)
const showDialog1 = ref(false)
//
const customEvent = (e: any) => {
formData.customer_id = e.id;
custom_name.value = e.name;
formData.project_id = e.id;
project_name.value = e.name;
project_code.value = e.project_code
showDialog.value = false;
};
const customEvent1 = (e: any) => {
formData.contract_id = e.id;
project_name.value = e.project_name;
project_code.value = e.project_code;
contract_name.value = e.contract_name;
contract_no.value = e.contract_code
showDialog1.value = false;
};
//
const getlist = () => {
getAll().then((res) => {
Object.assign(list1, res)
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.amount_daxie = toChinesNum(e)
}
})
}
//
const deptrmt = (e) => {
getlist1(e)
}
//
const getlist1 = (id: any) => {
deptAll({ 'org_id': id }).then((res) => {
Object.assign(list2, res)
})
}
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑退款申请表' : '新增退款申请表'
return mode.value == 'edit' ? '编辑安全事故表' : '新增安全事故表'
})
//
const formData = reactive({
id: '',
customer_id: "",
contract_id: "",
approve_id: 0,
refund_date: "",
reason: "",
amount: 0,
amount_daxie: "",
refund_type: "",
refunder: userInfo.name,
return_total_amount: "",
return_desc: "",
collection_bank: "",
collection_acccount: ""
project_id: "",
name: "",
happen_time: "",
type: "",
file: '',
remark: "",
dept_id: '',
org_id: "",
device_accident: "",
contractor_user: "",
not_our_company_user: "",
our_company_user: "",
content: "",
})
@ -274,9 +227,9 @@ const formRules = reactive<any>({
//
const setFormData = async (data: Record<any, any>) => {
if (data.return_desc && data.return_desc.length > 0) {
if (data.return_desc.includes(",")) {
const arry1 = data.return_desc.split(',').map((item: any, index: any) => {
if (data.file && data.file.length > 0) {
if (data.file.includes(",")) {
const arry1 = data.file.split(',').map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
@ -284,7 +237,7 @@ const setFormData = async (data: Record<any, any>) => {
});
Object.assign(formDataannex, arry1)
} else {
const arry1 = [{ name: `文件1`, uri: data.return_desc }]
const arry1 = [{ name: `文件1`, uri: data.file }]
Object.assign(formDataannex, arry1)
console.log(formDataannex)
@ -298,18 +251,17 @@ const setFormData = async (data: Record<any, any>) => {
formData[key] = data[key]
}
}
custom_name.value = data.custom.name
project_name.value = data.project.name
project_code.value = data.project.project_code
project_amount.value = data.contract.amount
contract_name.value = data.contract.contract_name;
contract_no.value = data.contract.contract_code
if (data.dept_id) {
getlist1(data.dept_id
)
}
project_name.value = data.project_name
project_code.value = data.project_code
}
const getDetail = async (row: Record<string, any>) => {
const data = await apirefundapplyDetail({
const data = await safetyaccidentDetail({
id: row.id
})
setFormData(data)
@ -319,16 +271,16 @@ const getDetail = async (row: Record<string, any>) => {
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.return_desc = formDataannex.map((item: any) => item.uri).toString()
formData.file = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
console.log(formRef.value?.validate(), '22222222')
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await apirefundapplyEdit(data)
: await apirefundapplyAdd(data)
? await safetyaccidentEdit(data)
: await safetyaccidentAdd(data)
popupRef.value?.close()
emit('success')
}
@ -337,11 +289,8 @@ const handleSubmit = async () => {
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getlist()
getAllProjectTypes().then((res) => {
protype.splice(0, protype.length, ...res);
})
}
//

View File

@ -2,13 +2,19 @@
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="合同编号" prop="project_name">
<el-input class="w-[280px]" v-model="queryParams.contract_no" clearable placeholder="请输入合同编号" />
<el-form-item label="事故类型" prop="type">
<el-input class="w-[280px]" v-model="queryParams.device_accident" clearable placeholder="请输入事故类型" />
</el-form-item>
<el-form-item label="合同名称" prop="project_role_name">
<el-input class="w-[280px]" v-model="queryParams.contract_name" clearable placeholder="请输入合同名称" />
<el-form-item label="设备事故" prop="type">
<el-input class="w-[280px]" v-model="queryParams.device_accident" clearable placeholder="请输入设备事故" />
</el-form-item>
<el-form-item label="事故名称" prop="name">
<el-input class="w-[280px]" v-model="queryParams.name" clearable placeholder="请输入事故名称" />
</el-form-item>
<el-form-item label="发生时间" prop="require">
<el-date-picker class="w-[280px]" v-model="queryParams.happen_time" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择发生时间">
</el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
@ -17,44 +23,42 @@
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['refund.refund/add']" type="primary" @click="handleAdd">
<el-button v-perms="['safety.safety_accident/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['refund.refund/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
<el-button v-perms="['safety.safety_accident/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="退款单号" prop="project_name" show-overflow-tooltip />
<el-table-column label="客户名称" prop="project_code" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_role_name" show-overflow-tooltip />
<el-table-column label="合同编号" prop="admin_name" show-overflow-tooltip />
<el-table-column label="退款原因" prop="reason" show-overflow-tooltip />
<el-table-column label="退款日期" prop="refund_date" show-overflow-tooltip />
<el-table-column label="退款金额" prop="amount" show-overflow-tooltip />
<el-table-column label="退款方式" prop="refund_type" show-overflow-tooltip>
<template #default="{ row }">
<dict-value :options="dictData.refund_type" :value="row.refund_type" />
</template>
</el-table-column>
<el-table-column label="退款人" prop="refunder" show-overflow-tooltip />
<el-table-column label="组织名称" prop="org_name" show-overflow-tooltip />
<el-table-column label="部门名称" prop="dept_name" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="项目编码" prop="project_code" show-overflow-tooltip />
<el-table-column label="事故名称" prop="name" show-overflow-tooltip />
<el-table-column label="发生时间" prop="happen_time" show-overflow-tooltip />
<el-table-column label="事故类型" prop="type" show-overflow-tooltip />
<el-table-column label="设备事故" prop="device_accident" show-overflow-tooltip />
<el-table-column label="承包商人员" prop="contractor_user" show-overflow-tooltip />
<el-table-column label="非本企业人员" prop="not_our_company_user" show-overflow-tooltip />
<el-table-column label="本企业人员" prop="our_company_user" show-overflow-tooltip />
<el-table-column label="内容" prop="content" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
<el-table-column label="附件" prop="file" show-overflow-tooltip />
<el-table-column label="操作" width="150" fixed="right">
<template #default="{ row }">
<el-button v-perms="['refund.refund/edit']" type="primary" link @click="handleEdit(row)">
<el-button v-perms="['safety.safety_accident/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['refund.refund/delete']" type="danger" link @click="handleDelete(row.id)">
<el-button v-perms="['safety.safety_accident/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['refund.refund/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
@ -72,7 +76,7 @@
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apirefundapplyLists, apirefundapplyDelete, apirefundapplyDetail } from '@/api/refund'
import { safetyaccidentLists, safetyaccidentDelete, safetyaccidentDetail } from '@/api/safety_accident'
import { timeFormat } from '@/utils/util'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
@ -87,9 +91,10 @@ const showDtail = ref(false)
//
const queryParams = reactive({
contract_no: '',
contract_name: '',
name: '',
happen_time: '',
device_accident: '',
type: '',
})
@ -106,7 +111,7 @@ const handleSelectionChange = (val: any[]) => {
const { dictData } = useDictData('refund_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apirefundapplyLists,
fetchFun: safetyaccidentLists,
params: queryParams
})
@ -121,7 +126,7 @@ const handleAdd = async () => {
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await apirefundapplyDetail({ id: data.id })
let res = await safetyaccidentDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
@ -131,11 +136,11 @@ const handleEdit = async (data: any) => {
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apirefundapplyDelete({ id })
await safetyaccidentDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await apirefundapplyDetail({ id: data.id })
let res = await safetyaccidentDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()

View File

@ -2,83 +2,131 @@
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-steps :active="active" align-center style="margin-bottom: 20px;">
<el-step title="商务部发起" />
<el-step title="商务总监" />
<el-step title="财务经理" />
<el-step title="总经理" />
</el-steps>
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="客户名称" prop="customer_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="custom_name" @click="showDialog = true" clearable placeholder="请选择客户" />
<el-form-item label="组织名称" prop="org_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.org_id" clearable placeholder="请选择组织" @change="deptrmt">
<el-option v-for="(item, index) in list1" :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款日期" prop="return_date">
<el-date-picker class="flex-1 !flex" v-model="formData.return_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择日期">
</el-date-picker>
<el-form-item label="部门名称" prop="dept_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.dept_id" clearable placeholder="请选择部门">
<el-option v-for="( item, index ) in list2 " :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="contract_id" @click="showDialog1 = true">
<el-form-item label="项目名称" prop="project_id" @click="showDialog = true">
<el-input v-model="project_name" clearable placeholder="请输入项目名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码" prop="contract_id">
<el-form-item label="项目编码" prop="project_id" @click="showDialog = true">
<el-input v-model="project_code" clearable placeholder="请输入项目编码" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号" prop="contract_no">
<el-input v-model="contract_no" clearable placeholder="请输入合同编号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称" prop="contract_name">
<el-input v-model="contract_name" clearable placeholder="请输入合同名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款原因" prop="reason">
<el-input v-model="formData.reason" type='textarea' clearable placeholder="请输入退款原因" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款金额" prop="amount">
<el-input v-model="formData.amount" clearable placeholder="请输入退款金额" @input="amountinput" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写" prop="amount_daxie">
<el-input v-model="formData.amount_daxie" readonly clearable placeholder="请输入金额大写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款方式" prop="contacts">
<el-select class="flex-1" v-model="formData.refund_type" clearable placeholder="请选择退款方式">
<el-option v-for="(item, index) in dictData.refund_type" :key="index" :label="item.name" :value="parseInt(item.value)" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款人" prop="refunder">
<el-input v-model="formData.refunder" readonly clearable placeholder="请输入退款人" />
<el-form-item label="检查名称" prop="check_name">
<el-input v-model="formData.check_name" clearable placeholder="请输入检查名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="8">
<el-form-item label="检查日期" prop="check_date">
<el-date-picker class="flex-1 !flex" v-model="formData.check_date" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择检查日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查人" prop="check_user">
<el-input v-model="formData.check_user" clearable placeholder="请输入检查人" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查单位" prop="check_company">
<el-input v-model="formData.check_company" clearable placeholder="请输入检查单位" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查区域" prop="check_area">
<el-input v-model="formData.check_area" clearable placeholder="请输入检查区域" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查项" prop="check_item">
<el-input v-model="formData.check_item" clearable placeholder="请输入检查项" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查性质" prop="check_nature">
<el-input v-model="formData.check_nature" clearable placeholder="请输入检查性质" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查结果" prop="check_result">
<el-input v-model="formData.check_result" clearable placeholder="请输入检查结果" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="整改单位" prop="modify_company">
<el-input v-model="formData.modify_company" clearable placeholder="请输入整改单位" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="整改期限" prop="modify_term">
<el-input v-model="formData.modify_term" clearable placeholder="请输入整改期限" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="责任人" prop="resp_user">
<el-input v-model="formData.resp_user" clearable placeholder="请输入责任人" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="风险等级" prop="risk_level">
<el-input v-model="formData.risk_level" clearable placeholder="请输入风险等级" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="安全隐患" prop="safety_hazard">
<el-input v-model="formData.safety_hazard" clearable placeholder="请输入安全隐患" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="质量隐患" prop="quality_hazard">
<el-input v-model="formData.quality_hazard" clearable placeholder="请输入质量隐患" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="子表" prop="sub_table">
<el-input v-model="formData.sub_table" clearable placeholder="请输入子表" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附件" prop="field127">
@ -89,7 +137,7 @@
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<div v-for="( item, index ) in formDataannex " style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
@ -98,34 +146,11 @@
</el-form-item>
</el-col>
</el-row>
<div style="margin: 20px 0;">客户收款信息</div>
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="收款账号" prop="collection_acccount" @click="showDialog2 = true">
<el-input v-model="formData.collection_acccount" clearable placeholder="请输入收款账号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收款银行" prop="collection_bank">
<el-input v-model="formData.collection_bank" clearable placeholder="请输入收款银行" />
</el-form-item>
</el-col>
</el-row>
<el-dialog v-model="showDialog" title="选择客户" width="70%">
<customDialog @customEvent="customEvent"></customDialog>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<porjectDialog @customEvent="customEvent"></porjectDialog>
</el-dialog>
<el-dialog v-model="showDialog1" title="选择合同" width="70%">
<salescontractDialog @customEvent="customEvent1"></salescontractDialog>
</el-dialog>
</el-form>
@ -135,12 +160,10 @@
</template>
<script lang="ts" setup name="projectEdit">
import customDialog from '@/components/custom-dialog/index.vue'
import porjectDialog from '@/components/project/index.vue'
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import salescontractDialog from '@/components/salescontract/index.vue'
import { apirefundapplyAdd, apirefundapplyEdit, apirefundapplyDetail } from '@/api/refund'
import { safetycheckAdd, safetycheckEdit, safetycheckDetail } from '@/api/safety_check'
import { toChinesNum } from "@/utils/util";
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
@ -153,14 +176,14 @@ const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const contract_name = ref('')
const list1 = reactive([])
const list2 = reactive([])
const showDialog = ref(false)
const project_name = ref('')
const project_code = ref('')
const project_amount = ref('')
const contract_no = ref('')
const custom_name = ref('')
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
const userInfo = userStore.userInfo
console.log(userInfo, '222222')
//
const handleAvatarSuccess_four = (
response,
@ -176,31 +199,7 @@ const handleAvatarSuccess_four = (
);
};
//
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
if (value && !/^1\d{10}$/.test(value)) {
callback(new Error('请输入正确的手机号码'));
} else {
callback()
}
}
const userEmail = (rule: any, value: string, callback: (arg0: Error | undefined) => void) => {
// const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
// // if (!value) {
// // return callback(new Error(''))
// // }
if (value && !mailReg.test(value)) {
callback(new Error('请输入正确的邮箱格式'))
} else {
callback()
}
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
@ -215,54 +214,61 @@ const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const amount_daxie = ref('')
const showDialog = ref(false)
const showDialog1 = ref(false)
//
const customEvent = (e: any) => {
formData.customer_id = e.id;
custom_name.value = e.name;
formData.project_id = e.id;
project_name.value = e.name;
project_code.value = e.project_code
showDialog.value = false;
};
const customEvent1 = (e: any) => {
formData.contract_id = e.id;
project_name.value = e.project_name;
project_code.value = e.project_code;
contract_name.value = e.contract_name;
contract_no.value = e.contract_code
showDialog1.value = false;
};
//
const getlist = () => {
getAll().then((res) => {
Object.assign(list1, res)
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.amount_daxie = toChinesNum(e)
}
})
}
//
const deptrmt = (e) => {
getlist1(e)
}
//
const getlist1 = (id: any) => {
deptAll({ 'org_id': id }).then((res) => {
Object.assign(list2, res)
})
}
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑退款申请表' : '新增退款申请表'
return mode.value == 'edit' ? '编辑安全检查表' : '新增安全检查表'
})
//
const formData = reactive({
id: '',
customer_id: "",
contract_id: "",
approve_id: 0,
refund_date: "",
reason: "",
amount: 0,
amount_daxie: "",
refund_type: "",
refunder: userInfo.name,
return_total_amount: "",
return_desc: "",
collection_bank: "",
collection_acccount: ""
org_id: '',
dept_id: '',
project_id: '',
check_name: '',
check_date: '',
check_user: '',
check_company: '',
check_area: '',
check_item: '',
check_result: '',
modify_company: '',
resp_user: '',
risk_level: '',
safety_hazard: '',
modify_term: '',
remark: '',
file: '',
check_nature: '',
quality_hazard: '',
sub_table: '',
})
@ -274,9 +280,9 @@ const formRules = reactive<any>({
//
const setFormData = async (data: Record<any, any>) => {
if (data.return_desc && data.return_desc.length > 0) {
if (data.return_desc.includes(",")) {
const arry1 = data.return_desc.split(',').map((item: any, index: any) => {
if (data.file && data.file.length > 0) {
if (data.file.includes(",")) {
const arry1 = data.file.split(',').map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
@ -284,7 +290,7 @@ const setFormData = async (data: Record<any, any>) => {
});
Object.assign(formDataannex, arry1)
} else {
const arry1 = [{ name: `文件1`, uri: data.return_desc }]
const arry1 = [{ name: `文件1`, uri: data.file }]
Object.assign(formDataannex, arry1)
console.log(formDataannex)
@ -298,18 +304,15 @@ const setFormData = async (data: Record<any, any>) => {
formData[key] = data[key]
}
}
custom_name.value = data.custom.name
project_name.value = data.project.name
project_code.value = data.project.project_code
project_amount.value = data.contract.amount
contract_name.value = data.contract.contract_name;
contract_no.value = data.contract.contract_code
if (data.dept_id) {
getlist1(data.dept_id
)
}
project_name.value = data.project_name
project_code.value = data.project_code
}
const getDetail = async (row: Record<string, any>) => {
const data = await apirefundapplyDetail({
const data = await safetycheckDetail({
id: row.id
})
setFormData(data)
@ -319,16 +322,16 @@ const getDetail = async (row: Record<string, any>) => {
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.return_desc = formDataannex.map((item: any) => item.uri).toString()
formData.file = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
console.log(formRef.value?.validate(), '22222222')
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await apirefundapplyEdit(data)
: await apirefundapplyAdd(data)
? await safetycheckEdit(data)
: await safetycheckAdd(data)
popupRef.value?.close()
emit('success')
}
@ -338,10 +341,8 @@ const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getAllProjectTypes().then((res) => {
getlist()
protype.splice(0, protype.length, ...res);
})
}
//

View File

@ -2,13 +2,23 @@
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="合同编号" prop="project_name">
<el-input class="w-[280px]" v-model="queryParams.contract_no" clearable placeholder="请输入合同编号" />
</el-form-item>
<el-form-item label="合同名称" prop="project_role_name">
<el-input class="w-[280px]" v-model="queryParams.contract_name" clearable placeholder="请输入合同名称" />
</el-form-item>
<el-form-item label="检查名称" prop="check_name">
<el-input class="w-[280px]" v-model="queryParams.check_name" clearable placeholder="请输入检查名称" />
</el-form-item>
<el-form-item label="检查人" prop="check_user">
<el-input class="w-[280px]" v-model="queryParams.check_user" clearable placeholder="请输入检查人" />
</el-form-item>
<el-form-item label="检查单位" prop="check_company">
<el-input class="w-[280px]" v-model="queryParams.check_company" clearable placeholder="请输入检查单位" />
</el-form-item>
<el-form-item label="检查区域" prop="check_area">
<el-input class="w-[280px]" v-model="queryParams.check_area" clearable placeholder="请输入检查区域" />
</el-form-item>
<el-form-item label="检查日期" prop="check_date">
<el-date-picker class="w-[280px]" v-model="queryParams.check_date" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择检查日期">
</el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
@ -17,44 +27,50 @@
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['refund.refund/add']" type="primary" @click="handleAdd">
<el-button v-perms="['safety.safety_check/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['refund.refund/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
<el-button v-perms="['safety.safety_check/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="退款单号" prop="project_name" show-overflow-tooltip />
<el-table-column label="客户名称" prop="project_code" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_role_name" show-overflow-tooltip />
<el-table-column label="合同编号" prop="admin_name" show-overflow-tooltip />
<el-table-column label="退款原因" prop="reason" show-overflow-tooltip />
<el-table-column label="退款日期" prop="refund_date" show-overflow-tooltip />
<el-table-column label="退款金额" prop="amount" show-overflow-tooltip />
<el-table-column label="退款方式" prop="refund_type" show-overflow-tooltip>
<template #default="{ row }">
<dict-value :options="dictData.refund_type" :value="row.refund_type" />
</template>
</el-table-column>
<el-table-column label="退款人" prop="refunder" show-overflow-tooltip />
<el-table-column label="组织名称" prop="org_name" show-overflow-tooltip />
<el-table-column label="部门名称" prop="dept_name" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="项目编码" prop="project_code" show-overflow-tooltip />
<el-table-column label="检查名称" prop="check_name" show-overflow-tooltip />
<el-table-column label="检查日期" prop="check_date" show-overflow-tooltip />
<el-table-column label="整改期限" prop="modify_term" show-overflow-tooltip />
<el-table-column label="检查人" prop="check_user" show-overflow-tooltip />
<el-table-column label="检查单位" prop="check_company" show-overflow-tooltip />
<el-table-column label="整改单位" prop="modify_company" show-overflow-tooltip />
<el-table-column label="责任人" prop="resp_user" show-overflow-tooltip />
<el-table-column label="检查区域" prop="check_area" show-overflow-tooltip />
<el-table-column label="风险等级" prop="risk_level" show-overflow-tooltip />
<el-table-column label="检查项" prop="check_item" show-overflow-tooltip />
<el-table-column label="安全隐患" prop="safety_hazard" show-overflow-tooltip />
<el-table-column label="检查性质" prop="check_nature" show-overflow-tooltip />
<el-table-column label="检查结果" prop="check_result" show-overflow-tooltip />
<el-table-column label="质量隐患" prop="quality_hazard" show-overflow-tooltip />
<el-table-column label="子表" prop="content" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
<el-table-column label="附件" prop="file" show-overflow-tooltip />
<el-table-column label="操作" width="150" fixed="right">
<template #default="{ row }">
<el-button v-perms="['refund.refund/edit']" type="primary" link @click="handleEdit(row)">
<el-button v-perms="['safety.safety_check/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['refund.refund/delete']" type="danger" link @click="handleDelete(row.id)">
<el-button v-perms="['safety.safety_check/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['refund.refund/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
@ -72,7 +88,7 @@
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apirefundapplyLists, apirefundapplyDelete, apirefundapplyDetail } from '@/api/refund'
import { safetycheckLists, safetycheckDelete, safetycheckDetail } from '@/api/safety_check'
import { timeFormat } from '@/utils/util'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
@ -87,9 +103,11 @@ const showDtail = ref(false)
//
const queryParams = reactive({
contract_no: '',
contract_name: '',
check_name: '',
check_date: '',
check_company: '',
check_user: '',
check_area: '',
})
@ -106,7 +124,7 @@ const handleSelectionChange = (val: any[]) => {
const { dictData } = useDictData('refund_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apirefundapplyLists,
fetchFun: safetycheckLists,
params: queryParams
})
@ -121,7 +139,7 @@ const handleAdd = async () => {
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await apirefundapplyDetail({ id: data.id })
let res = await safetycheckDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
@ -131,11 +149,11 @@ const handleEdit = async (data: any) => {
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apirefundapplyDelete({ id })
await safetycheckDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await apirefundapplyDetail({ id: data.id })
let res = await safetycheckDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()

View File

@ -1,84 +1,55 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-steps :active="active" align-center style="margin-bottom: 20px;">
<el-step title="商务部发起" />
<el-step title="商务总监" />
<el-step title="财务经理" />
<el-step title="总经理" />
</el-steps>
<popup ref="popupRef" :title="popupTitle" :async="true" width="550px" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="客户名称" prop="customer_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="custom_name" @click="showDialog = true" clearable placeholder="请选择客户" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款日期" prop="return_date">
<el-date-picker class="flex-1 !flex" v-model="formData.return_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="contract_id" @click="showDialog1 = true">
<el-input v-model="project_name" clearable placeholder="请输入项目名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入项目编码" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号" prop="contract_no">
<el-input v-model="contract_no" clearable placeholder="请输入合同编号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称" prop="contract_name">
<el-input v-model="contract_name" clearable placeholder="请输入合同名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款原因" prop="reason">
<el-input v-model="formData.reason" type='textarea' clearable placeholder="请输入退款原因" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款金额" prop="amount">
<el-input v-model="formData.amount" clearable placeholder="请输入退款金额" @input="amountinput" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写" prop="amount_daxie">
<el-input v-model="formData.amount_daxie" readonly clearable placeholder="请输入金额大写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款方式" prop="contacts">
<el-select class="flex-1" v-model="formData.refund_type" clearable placeholder="请选择退款方式">
<el-option v-for="(item, index) in dictData.refund_type" :key="index" :label="item.name" :value="parseInt(item.value)" />
<el-col :span="24">
<el-form-item label="组织名称" prop="org_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.org_id" clearable placeholder="请选择组织" @change="deptrmt">
<el-option v-for="(item, index) in list1" :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款人" prop="refunder">
<el-input v-model="formData.refunder" readonly clearable placeholder="请输入退款人" />
<el-col :span="24">
<el-form-item label="部门名称" prop="dept_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.dept_id" clearable placeholder="请选择部门">
<el-option v-for="( item, index ) in list2 " :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="项目名称" prop="project_id" @click="showDialog = true">
<el-input v-model="project_name" clearable placeholder="请输入项目名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="24">
<el-form-item label="名称" prop="name">
<el-input v-model="formData.name" clearable placeholder="请输入名称" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="内容" prop="content">
<el-input v-model="formData.content" type="textarea" clearable placeholder="请输入内容" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="发生时间" prop="require">
<el-date-picker v-model="formData.happen_date" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择发生时间">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附件" prop="field127">
@ -89,7 +60,7 @@
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<div v-for="( item, index ) in formDataannex " style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
@ -98,34 +69,11 @@
</el-form-item>
</el-col>
</el-row>
<div style="margin: 20px 0;">客户收款信息</div>
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="收款账号" prop="collection_acccount" @click="showDialog2 = true">
<el-input v-model="formData.collection_acccount" clearable placeholder="请输入收款账号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收款银行" prop="collection_bank">
<el-input v-model="formData.collection_bank" clearable placeholder="请输入收款银行" />
</el-form-item>
</el-col>
</el-row>
<el-dialog v-model="showDialog" title="选择客户" width="70%">
<customDialog @customEvent="customEvent"></customDialog>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<porjectDialog @customEvent="customEvent"></porjectDialog>
</el-dialog>
<el-dialog v-model="showDialog1" title="选择合同" width="70%">
<salescontractDialog @customEvent="customEvent1"></salescontractDialog>
</el-dialog>
</el-form>
@ -135,12 +83,10 @@
</template>
<script lang="ts" setup name="projectEdit">
import customDialog from '@/components/custom-dialog/index.vue'
import porjectDialog from '@/components/project/index.vue'
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import salescontractDialog from '@/components/salescontract/index.vue'
import { apirefundapplyAdd, apirefundapplyEdit, apirefundapplyDetail } from '@/api/refund'
import { safetyemergencyplanAdd, safetyemergencyplanEdit, safetyemergencyplanDetail } from '@/api/safety_emergency_plan'
import { toChinesNum } from "@/utils/util";
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
@ -153,14 +99,14 @@ const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const contract_name = ref('')
const list1 = reactive([])
const list2 = reactive([])
const showDialog = ref(false)
const project_name = ref('')
const project_code = ref('')
const project_amount = ref('')
const contract_no = ref('')
const custom_name = ref('')
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
const userInfo = userStore.userInfo
console.log(userInfo, '222222')
//
const handleAvatarSuccess_four = (
response,
@ -176,31 +122,7 @@ const handleAvatarSuccess_four = (
);
};
//
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
if (value && !/^1\d{10}$/.test(value)) {
callback(new Error('请输入正确的手机号码'));
} else {
callback()
}
}
const userEmail = (rule: any, value: string, callback: (arg0: Error | undefined) => void) => {
// const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
// // if (!value) {
// // return callback(new Error(''))
// // }
if (value && !mailReg.test(value)) {
callback(new Error('请输入正确的邮箱格式'))
} else {
callback()
}
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
@ -215,54 +137,49 @@ const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const amount_daxie = ref('')
const showDialog = ref(false)
const showDialog1 = ref(false)
//
const customEvent = (e: any) => {
formData.customer_id = e.id;
custom_name.value = e.name;
formData.project_id = e.id;
project_name.value = e.name;
project_code.value = e.project_code
showDialog.value = false;
};
const customEvent1 = (e: any) => {
formData.contract_id = e.id;
project_name.value = e.project_name;
project_code.value = e.project_code;
contract_name.value = e.contract_name;
contract_no.value = e.contract_code
showDialog1.value = false;
};
//
const getlist = () => {
getAll().then((res) => {
Object.assign(list1, res)
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.amount_daxie = toChinesNum(e)
}
})
}
//
const deptrmt = (e) => {
getlist1(e)
}
//
const getlist1 = (id: any) => {
deptAll({ 'org_id': id }).then((res) => {
Object.assign(list2, res)
})
}
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑退款申请表' : '新增退款申请表'
return mode.value == 'edit' ? '编辑应急预案表' : '新增应急预案表'
})
//
const formData = reactive({
id: '',
customer_id: "",
contract_id: "",
approve_id: 0,
refund_date: "",
reason: "",
amount: 0,
amount_daxie: "",
refund_type: "",
refunder: userInfo.name,
return_total_amount: "",
return_desc: "",
collection_bank: "",
collection_acccount: ""
project_id: "",
name: "",
happen_date: "",
content: "",
file: '',
remark: "",
dept_id: '',
org_id: "",
})
@ -274,9 +191,9 @@ const formRules = reactive<any>({
//
const setFormData = async (data: Record<any, any>) => {
if (data.return_desc && data.return_desc.length > 0) {
if (data.return_desc.includes(",")) {
const arry1 = data.return_desc.split(',').map((item: any, index: any) => {
if (data.file && data.file.length > 0) {
if (data.file.includes(",")) {
const arry1 = data.file.split(',').map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
@ -284,13 +201,16 @@ const setFormData = async (data: Record<any, any>) => {
});
Object.assign(formDataannex, arry1)
} else {
const arry1 = [{ name: `文件1`, uri: data.return_desc }]
const arry1 = [{ name: `文件1`, uri: data.file }]
Object.assign(formDataannex, arry1)
console.log(formDataannex)
}
}
if (data.dept_id) {
getlist1(data.dept_id
)
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
@ -298,18 +218,14 @@ const setFormData = async (data: Record<any, any>) => {
formData[key] = data[key]
}
}
custom_name.value = data.custom.name
project_name.value = data.project.name
project_code.value = data.project.project_code
project_amount.value = data.contract.amount
contract_name.value = data.contract.contract_name;
contract_no.value = data.contract.contract_code
project_name.value = data.project_name
project_code.value = data.project_code
}
const getDetail = async (row: Record<string, any>) => {
const data = await apirefundapplyDetail({
const data = await safetyemergencyplanDetail({
id: row.id
})
setFormData(data)
@ -319,16 +235,16 @@ const getDetail = async (row: Record<string, any>) => {
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.return_desc = formDataannex.map((item: any) => item.uri).toString()
formData.file = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
console.log(formRef.value?.validate(), '22222222')
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await apirefundapplyEdit(data)
: await apirefundapplyAdd(data)
? await safetyemergencyplanEdit(data)
: await safetyemergencyplanAdd(data)
popupRef.value?.close()
emit('success')
}
@ -337,11 +253,8 @@ const handleSubmit = async () => {
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getlist()
getAllProjectTypes().then((res) => {
protype.splice(0, protype.length, ...res);
})
}
//

View File

@ -2,13 +2,14 @@
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="合同编号" prop="project_name">
<el-input class="w-[280px]" v-model="queryParams.contract_no" clearable placeholder="请输入合同编号" />
</el-form-item>
<el-form-item label="合同名称" prop="project_role_name">
<el-input class="w-[280px]" v-model="queryParams.contract_name" clearable placeholder="请输入合同名称" />
</el-form-item>
<el-form-item label="名称" prop="name">
<el-input v-model="queryParams.name" clearable placeholder="请输入名称" />
</el-form-item>
<el-form-item label="发生时间" prop="require">
<el-date-picker v-model="queryParams.happen_date" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择发生时间">
</el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
@ -17,44 +18,36 @@
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['refund.refund/add']" type="primary" @click="handleAdd">
<el-button v-perms="['safety.safety_emergency_plan/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['refund.refund/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
<el-button v-perms="['safety.safety_emergency_plan/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="退款单号" prop="project_name" show-overflow-tooltip />
<el-table-column label="客户名称" prop="project_code" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_role_name" show-overflow-tooltip />
<el-table-column label="合同编号" prop="admin_name" show-overflow-tooltip />
<el-table-column label="退款原因" prop="reason" show-overflow-tooltip />
<el-table-column label="退款日期" prop="refund_date" show-overflow-tooltip />
<el-table-column label="退款金额" prop="amount" show-overflow-tooltip />
<el-table-column label="退款方式" prop="refund_type" show-overflow-tooltip>
<template #default="{ row }">
<dict-value :options="dictData.refund_type" :value="row.refund_type" />
</template>
</el-table-column>
<el-table-column label="退款人" prop="refunder" show-overflow-tooltip />
<el-table-column label="组织名称" prop="org_name" show-overflow-tooltip />
<el-table-column label="部门名称" prop="dept_name" show-overflow-tooltip />
<el-table-column label="所属项目" prop="project_name" show-overflow-tooltip />
<el-table-column label="名称" prop="name" show-overflow-tooltip />
<el-table-column label="发生时间" prop="happen_date" show-overflow-tooltip />
<el-table-column label="内容" prop="content" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
<el-table-column label="附件" prop="file" show-overflow-tooltip />
<el-table-column label="操作" width="150" fixed="right">
<template #default="{ row }">
<el-button v-perms="['refund.refund/edit']" type="primary" link @click="handleEdit(row)">
<el-button v-perms="['safety.safety_emergency_plan/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['refund.refund/delete']" type="danger" link @click="handleDelete(row.id)">
<el-button v-perms="['safety.safety_emergency_plan/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['refund.refund/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
@ -72,7 +65,7 @@
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apirefundapplyLists, apirefundapplyDelete, apirefundapplyDetail } from '@/api/refund'
import { safetyemergencyplanLists, safetyemergencyplanDelete, safetyemergencyplanDetail } from '@/api/safety_emergency_plan'
import { timeFormat } from '@/utils/util'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
@ -87,8 +80,8 @@ const showDtail = ref(false)
//
const queryParams = reactive({
contract_no: '',
contract_name: '',
name: '',
happen_date: '',
})
@ -106,7 +99,7 @@ const handleSelectionChange = (val: any[]) => {
const { dictData } = useDictData('refund_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apirefundapplyLists,
fetchFun: safetyemergencyplanLists,
params: queryParams
})
@ -121,7 +114,7 @@ const handleAdd = async () => {
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await apirefundapplyDetail({ id: data.id })
let res = await safetyemergencyplanDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
@ -131,11 +124,11 @@ const handleEdit = async (data: any) => {
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apirefundapplyDelete({ id })
await safetyemergencyplanDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await apirefundapplyDetail({ id: data.id })
let res = await safetyemergencyplanDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()

View File

@ -1,84 +1,55 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-steps :active="active" align-center style="margin-bottom: 20px;">
<el-step title="商务部发起" />
<el-step title="商务总监" />
<el-step title="财务经理" />
<el-step title="总经理" />
</el-steps>
<popup ref="popupRef" :title="popupTitle" :async="true" width="550px" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="客户名称" prop="customer_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="custom_name" @click="showDialog = true" clearable placeholder="请选择客户" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款日期" prop="return_date">
<el-date-picker class="flex-1 !flex" v-model="formData.return_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="contract_id" @click="showDialog1 = true">
<el-input v-model="project_name" clearable placeholder="请输入项目名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入项目编码" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号" prop="contract_no">
<el-input v-model="contract_no" clearable placeholder="请输入合同编号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称" prop="contract_name">
<el-input v-model="contract_name" clearable placeholder="请输入合同名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款原因" prop="reason">
<el-input v-model="formData.reason" type='textarea' clearable placeholder="请输入退款原因" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款金额" prop="amount">
<el-input v-model="formData.amount" clearable placeholder="请输入退款金额" @input="amountinput" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写" prop="amount_daxie">
<el-input v-model="formData.amount_daxie" readonly clearable placeholder="请输入金额大写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款方式" prop="contacts">
<el-select class="flex-1" v-model="formData.refund_type" clearable placeholder="请选择退款方式">
<el-option v-for="(item, index) in dictData.refund_type" :key="index" :label="item.name" :value="parseInt(item.value)" />
<el-col :span="24">
<el-form-item label="组织名称" prop="org_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.org_id" clearable placeholder="请选择组织" @change="deptrmt">
<el-option v-for="(item, index) in list1" :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款人" prop="refunder">
<el-input v-model="formData.refunder" readonly clearable placeholder="请输入退款人" />
<el-col :span="24">
<el-form-item label="部门名称" prop="dept_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.dept_id" clearable placeholder="请选择部门">
<el-option v-for="( item, index ) in list2 " :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="项目名称" prop="project_id" @click="showDialog = true">
<el-input v-model="project_name" clearable placeholder="请输入项目名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="24">
<el-form-item label="名称" prop="name">
<el-input v-model="formData.name" clearable placeholder="请输入名称" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="内容" prop="content">
<el-input v-model="formData.content" type="textarea" clearable placeholder="请输入内容" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="发生时间" prop="require">
<el-date-picker v-model="formData.happen_date" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择发生时间">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附件" prop="field127">
@ -89,7 +60,7 @@
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<div v-for="( item, index ) in formDataannex " style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
@ -98,34 +69,11 @@
</el-form-item>
</el-col>
</el-row>
<div style="margin: 20px 0;">客户收款信息</div>
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="收款账号" prop="collection_acccount" @click="showDialog2 = true">
<el-input v-model="formData.collection_acccount" clearable placeholder="请输入收款账号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收款银行" prop="collection_bank">
<el-input v-model="formData.collection_bank" clearable placeholder="请输入收款银行" />
</el-form-item>
</el-col>
</el-row>
<el-dialog v-model="showDialog" title="选择客户" width="70%">
<customDialog @customEvent="customEvent"></customDialog>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<porjectDialog @customEvent="customEvent"></porjectDialog>
</el-dialog>
<el-dialog v-model="showDialog1" title="选择合同" width="70%">
<salescontractDialog @customEvent="customEvent1"></salescontractDialog>
</el-dialog>
</el-form>
@ -135,12 +83,10 @@
</template>
<script lang="ts" setup name="projectEdit">
import customDialog from '@/components/custom-dialog/index.vue'
import porjectDialog from '@/components/project/index.vue'
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import salescontractDialog from '@/components/salescontract/index.vue'
import { apirefundapplyAdd, apirefundapplyEdit, apirefundapplyDetail } from '@/api/refund'
import { safetyevaluateAdd, safetyevaluateEdit, safetyevaluateDetail } from '@/api/safety_evaluate'
import { toChinesNum } from "@/utils/util";
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
@ -153,14 +99,14 @@ const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const contract_name = ref('')
const list1 = reactive([])
const list2 = reactive([])
const showDialog = ref(false)
const project_name = ref('')
const project_code = ref('')
const project_amount = ref('')
const contract_no = ref('')
const custom_name = ref('')
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
const userInfo = userStore.userInfo
console.log(userInfo, '222222')
//
const handleAvatarSuccess_four = (
response,
@ -176,31 +122,7 @@ const handleAvatarSuccess_four = (
);
};
//
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
if (value && !/^1\d{10}$/.test(value)) {
callback(new Error('请输入正确的手机号码'));
} else {
callback()
}
}
const userEmail = (rule: any, value: string, callback: (arg0: Error | undefined) => void) => {
// const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
// // if (!value) {
// // return callback(new Error(''))
// // }
if (value && !mailReg.test(value)) {
callback(new Error('请输入正确的邮箱格式'))
} else {
callback()
}
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
@ -215,54 +137,49 @@ const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const amount_daxie = ref('')
const showDialog = ref(false)
const showDialog1 = ref(false)
//
const customEvent = (e: any) => {
formData.customer_id = e.id;
custom_name.value = e.name;
formData.project_id = e.id;
project_name.value = e.name;
project_code.value = e.project_code
showDialog.value = false;
};
const customEvent1 = (e: any) => {
formData.contract_id = e.id;
project_name.value = e.project_name;
project_code.value = e.project_code;
contract_name.value = e.contract_name;
contract_no.value = e.contract_code
showDialog1.value = false;
};
//
const getlist = () => {
getAll().then((res) => {
Object.assign(list1, res)
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.amount_daxie = toChinesNum(e)
}
})
}
//
const deptrmt = (e) => {
getlist1(e)
}
//
const getlist1 = (id: any) => {
deptAll({ 'org_id': id }).then((res) => {
Object.assign(list2, res)
})
}
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑退款申请表' : '新增退款申请表'
return mode.value == 'edit' ? '编辑安全评估表' : '新增安全评估表'
})
//
const formData = reactive({
id: '',
customer_id: "",
contract_id: "",
approve_id: 0,
refund_date: "",
reason: "",
amount: 0,
amount_daxie: "",
refund_type: "",
refunder: userInfo.name,
return_total_amount: "",
return_desc: "",
collection_bank: "",
collection_acccount: ""
project_id: "",
name: "",
happen_date: "",
content: "",
file: '',
remark: "",
dept_id: '',
org_id: "",
})
@ -274,9 +191,9 @@ const formRules = reactive<any>({
//
const setFormData = async (data: Record<any, any>) => {
if (data.return_desc && data.return_desc.length > 0) {
if (data.return_desc.includes(",")) {
const arry1 = data.return_desc.split(',').map((item: any, index: any) => {
if (data.file && data.file.length > 0) {
if (data.file.includes(",")) {
const arry1 = data.file.split(',').map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
@ -284,13 +201,16 @@ const setFormData = async (data: Record<any, any>) => {
});
Object.assign(formDataannex, arry1)
} else {
const arry1 = [{ name: `文件1`, uri: data.return_desc }]
const arry1 = [{ name: `文件1`, uri: data.file }]
Object.assign(formDataannex, arry1)
console.log(formDataannex)
}
}
if (data.dept_id) {
getlist1(data.dept_id
)
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
@ -298,18 +218,14 @@ const setFormData = async (data: Record<any, any>) => {
formData[key] = data[key]
}
}
custom_name.value = data.custom.name
project_name.value = data.project.name
project_code.value = data.project.project_code
project_amount.value = data.contract.amount
contract_name.value = data.contract.contract_name;
contract_no.value = data.contract.contract_code
project_name.value = data.project_name
project_code.value = data.project_code
}
const getDetail = async (row: Record<string, any>) => {
const data = await apirefundapplyDetail({
const data = await safetyevaluateDetail({
id: row.id
})
setFormData(data)
@ -319,16 +235,16 @@ const getDetail = async (row: Record<string, any>) => {
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.return_desc = formDataannex.map((item: any) => item.uri).toString()
formData.file = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
console.log(formRef.value?.validate(), '22222222')
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await apirefundapplyEdit(data)
: await apirefundapplyAdd(data)
? await safetyevaluateEdit(data)
: await safetyevaluateAdd(data)
popupRef.value?.close()
emit('success')
}
@ -337,11 +253,8 @@ const handleSubmit = async () => {
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getlist()
getAllProjectTypes().then((res) => {
protype.splice(0, protype.length, ...res);
})
}
//

View File

@ -2,13 +2,14 @@
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="合同编号" prop="project_name">
<el-input class="w-[280px]" v-model="queryParams.contract_no" clearable placeholder="请输入合同编号" />
</el-form-item>
<el-form-item label="合同名称" prop="project_role_name">
<el-input class="w-[280px]" v-model="queryParams.contract_name" clearable placeholder="请输入合同名称" />
</el-form-item>
<el-form-item label="名称" prop="name">
<el-input v-model="queryParams.name" clearable placeholder="请输入名称" />
</el-form-item>
<el-form-item label="发生时间" prop="require">
<el-date-picker v-model="queryParams.happen_date" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择发生时间">
</el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
@ -17,44 +18,36 @@
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['refund.refund/add']" type="primary" @click="handleAdd">
<el-button v-perms="['safety.safety_evaluate/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['refund.refund/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
<el-button v-perms="['safety.safety_evaluate/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="退款单号" prop="project_name" show-overflow-tooltip />
<el-table-column label="客户名称" prop="project_code" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_role_name" show-overflow-tooltip />
<el-table-column label="合同编号" prop="admin_name" show-overflow-tooltip />
<el-table-column label="退款原因" prop="reason" show-overflow-tooltip />
<el-table-column label="退款日期" prop="refund_date" show-overflow-tooltip />
<el-table-column label="退款金额" prop="amount" show-overflow-tooltip />
<el-table-column label="退款方式" prop="refund_type" show-overflow-tooltip>
<template #default="{ row }">
<dict-value :options="dictData.refund_type" :value="row.refund_type" />
</template>
</el-table-column>
<el-table-column label="退款人" prop="refunder" show-overflow-tooltip />
<el-table-column label="组织名称" prop="org_name" show-overflow-tooltip />
<el-table-column label="部门名称" prop="dept_name" show-overflow-tooltip />
<el-table-column label="所属项目" prop="project_name" show-overflow-tooltip />
<el-table-column label="名称" prop="name" show-overflow-tooltip />
<el-table-column label="发生时间" prop="happen_date" show-overflow-tooltip />
<el-table-column label="内容" prop="content" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
<el-table-column label="附件" prop="file" show-overflow-tooltip />
<el-table-column label="操作" width="150" fixed="right">
<template #default="{ row }">
<el-button v-perms="['refund.refund/edit']" type="primary" link @click="handleEdit(row)">
<el-button v-perms="['safety.safety_evaluate/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['refund.refund/delete']" type="danger" link @click="handleDelete(row.id)">
<el-button v-perms="['safety.safety_evaluate/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['refund.refund/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
@ -72,7 +65,7 @@
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apirefundapplyLists, apirefundapplyDelete, apirefundapplyDetail } from '@/api/refund'
import { safetyevaluateLists, safetyevaluateDelete, safetyevaluateDetail } from '@/api/safety_evaluate'
import { timeFormat } from '@/utils/util'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
@ -87,8 +80,8 @@ const showDtail = ref(false)
//
const queryParams = reactive({
contract_no: '',
contract_name: '',
name: '',
happen_date: '',
})
@ -106,7 +99,7 @@ const handleSelectionChange = (val: any[]) => {
const { dictData } = useDictData('refund_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apirefundapplyLists,
fetchFun: safetyevaluateLists,
params: queryParams
})
@ -121,7 +114,7 @@ const handleAdd = async () => {
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await apirefundapplyDetail({ id: data.id })
let res = await safetyevaluateDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
@ -131,11 +124,11 @@ const handleEdit = async (data: any) => {
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apirefundapplyDelete({ id })
await safetyevaluateDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await apirefundapplyDetail({ id: data.id })
let res = await safetyevaluateDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()

View File

@ -1,84 +1,42 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-steps :active="active" align-center style="margin-bottom: 20px;">
<el-step title="商务部发起" />
<el-step title="商务总监" />
<el-step title="财务经理" />
<el-step title="总经理" />
</el-steps>
<popup ref="popupRef" :title="popupTitle" :async="true" width="550px" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="客户名称" prop="customer_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="custom_name" @click="showDialog = true" clearable placeholder="请选择客户" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款日期" prop="return_date">
<el-date-picker class="flex-1 !flex" v-model="formData.return_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="contract_id" @click="showDialog1 = true">
<el-col :span="24">
<el-form-item label="项目名称" prop="project_id" @click="showDialog = true">
<el-input v-model="project_name" clearable placeholder="请输入项目名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入项目编码" />
<el-col :span="24">
<el-form-item label="名称" prop="name">
<el-input v-model="formData.name" clearable placeholder="请输入名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号" prop="contract_no">
<el-input v-model="contract_no" clearable placeholder="请输入合同编号" />
<el-col :span="24">
<el-form-item label="内容" prop="content">
<el-input v-model="formData.content" type="textarea" clearable placeholder="请输入内容" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称" prop="contract_name">
<el-input v-model="contract_name" clearable placeholder="请输入合同名称" />
<el-col :span="24">
<el-form-item label="发生时间" prop="require">
<el-date-picker v-model="formData.happen_time" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择发生时间">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款原因" prop="reason">
<el-input v-model="formData.reason" type='textarea' clearable placeholder="请输入退款原因" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款金额" prop="amount">
<el-input v-model="formData.amount" clearable placeholder="请输入退款金额" @input="amountinput" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写" prop="amount_daxie">
<el-input v-model="formData.amount_daxie" readonly clearable placeholder="请输入金额大写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款方式" prop="contacts">
<el-select class="flex-1" v-model="formData.refund_type" clearable placeholder="请选择退款方式">
<el-option v-for="(item, index) in dictData.refund_type" :key="index" :label="item.name" :value="parseInt(item.value)" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款人" prop="refunder">
<el-input v-model="formData.refunder" readonly clearable placeholder="请输入退款人" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附件" prop="field127">
@ -89,7 +47,7 @@
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<div v-for="( item, index ) in formDataannex " style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
@ -98,34 +56,11 @@
</el-form-item>
</el-col>
</el-row>
<div style="margin: 20px 0;">客户收款信息</div>
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="收款账号" prop="collection_acccount" @click="showDialog2 = true">
<el-input v-model="formData.collection_acccount" clearable placeholder="请输入收款账号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收款银行" prop="collection_bank">
<el-input v-model="formData.collection_bank" clearable placeholder="请输入收款银行" />
</el-form-item>
</el-col>
</el-row>
<el-dialog v-model="showDialog" title="选择客户" width="70%">
<customDialog @customEvent="customEvent"></customDialog>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<porjectDialog @customEvent="customEvent"></porjectDialog>
</el-dialog>
<el-dialog v-model="showDialog1" title="选择合同" width="70%">
<salescontractDialog @customEvent="customEvent1"></salescontractDialog>
</el-dialog>
</el-form>
@ -135,12 +70,10 @@
</template>
<script lang="ts" setup name="projectEdit">
import customDialog from '@/components/custom-dialog/index.vue'
import porjectDialog from '@/components/project/index.vue'
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import salescontractDialog from '@/components/salescontract/index.vue'
import { apirefundapplyAdd, apirefundapplyEdit, apirefundapplyDetail } from '@/api/refund'
import { safetyeventAdd, safetyeventEdit, safetyeventDetail } from '@/api/safety_event'
import { toChinesNum } from "@/utils/util";
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
@ -153,14 +86,11 @@ const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const contract_name = ref('')
const list1 = reactive([])
const list2 = reactive([])
const showDialog = ref(false)
const project_name = ref('')
const project_code = ref('')
const project_amount = ref('')
const contract_no = ref('')
const custom_name = ref('')
const userInfo = userStore.userInfo
console.log(userInfo, '222222')
//
const handleAvatarSuccess_four = (
response,
@ -176,31 +106,7 @@ const handleAvatarSuccess_four = (
);
};
//
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
if (value && !/^1\d{10}$/.test(value)) {
callback(new Error('请输入正确的手机号码'));
} else {
callback()
}
}
const userEmail = (rule: any, value: string, callback: (arg0: Error | undefined) => void) => {
// const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
// // if (!value) {
// // return callback(new Error(''))
// // }
if (value && !mailReg.test(value)) {
callback(new Error('请输入正确的邮箱格式'))
} else {
callback()
}
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
@ -215,54 +121,32 @@ const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const amount_daxie = ref('')
const showDialog = ref(false)
const showDialog1 = ref(false)
//
const customEvent = (e: any) => {
formData.customer_id = e.id;
custom_name.value = e.name;
formData.project_id = e.id;
project_name.value = e.name;
showDialog.value = false;
};
const customEvent1 = (e: any) => {
formData.contract_id = e.id;
project_name.value = e.project_name;
project_code.value = e.project_code;
contract_name.value = e.contract_name;
contract_no.value = e.contract_code
showDialog1.value = false;
};
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.amount_daxie = toChinesNum(e)
}
}
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑退款申请表' : '新增退款申请表'
return mode.value == 'edit' ? '编辑应急预案表' : '新增应急预案表'
})
//
const formData = reactive({
id: '',
customer_id: "",
contract_id: "",
approve_id: 0,
refund_date: "",
reason: "",
amount: 0,
amount_daxie: "",
refund_type: "",
refunder: userInfo.name,
return_total_amount: "",
return_desc: "",
collection_bank: "",
collection_acccount: ""
project_id: '',
name: "",
happen_time: "",
content: "",
file: '',
remark: "",
})
@ -274,9 +158,9 @@ const formRules = reactive<any>({
//
const setFormData = async (data: Record<any, any>) => {
if (data.return_desc && data.return_desc.length > 0) {
if (data.return_desc.includes(",")) {
const arry1 = data.return_desc.split(',').map((item: any, index: any) => {
if (data.file && data.file.length > 0) {
if (data.file.includes(",")) {
const arry1 = data.file.split(',').map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
@ -284,32 +168,25 @@ const setFormData = async (data: Record<any, any>) => {
});
Object.assign(formDataannex, arry1)
} else {
const arry1 = [{ name: `文件1`, uri: data.return_desc }]
const arry1 = [{ name: `文件1`, uri: data.file }]
Object.assign(formDataannex, arry1)
console.log(formDataannex)
}
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
custom_name.value = data.custom.name
project_name.value = data.project.name
project_code.value = data.project.project_code
project_amount.value = data.contract.amount
contract_name.value = data.contract.contract_name;
contract_no.value = data.contract.contract_code
}
const getDetail = async (row: Record<string, any>) => {
const data = await apirefundapplyDetail({
const data = await safetyeventDetail({
id: row.id
})
setFormData(data)
@ -319,16 +196,16 @@ const getDetail = async (row: Record<string, any>) => {
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.return_desc = formDataannex.map((item: any) => item.uri).toString()
formData.file = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
console.log(formRef.value?.validate(), '22222222')
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await apirefundapplyEdit(data)
: await apirefundapplyAdd(data)
? await safetyeventEdit(data)
: await safetyeventAdd(data)
popupRef.value?.close()
emit('success')
}
@ -338,10 +215,7 @@ const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getAllProjectTypes().then((res) => {
protype.splice(0, protype.length, ...res);
})
}
//

View File

@ -2,13 +2,14 @@
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="合同编号" prop="project_name">
<el-input class="w-[280px]" v-model="queryParams.contract_no" clearable placeholder="请输入合同编号" />
</el-form-item>
<el-form-item label="合同名称" prop="project_role_name">
<el-input class="w-[280px]" v-model="queryParams.contract_name" clearable placeholder="请输入合同名称" />
</el-form-item>
<el-form-item label="事件名称" prop="name">
<el-input v-model="queryParams.name" clearable placeholder="请输入事件名称" />
</el-form-item>
<el-form-item label="发生时间" prop="require">
<el-date-picker v-model="queryParams.happen_time" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择发生时间">
</el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
@ -17,44 +18,37 @@
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['refund.refund/add']" type="primary" @click="handleAdd">
<el-button v-perms="['safety.safety_event/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['refund.refund/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
<el-button v-perms="['safety.safety_event/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="退款单号" prop="project_name" show-overflow-tooltip />
<el-table-column label="客户名称" prop="project_code" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_role_name" show-overflow-tooltip />
<el-table-column label="合同编号" prop="admin_name" show-overflow-tooltip />
<el-table-column label="退款原因" prop="reason" show-overflow-tooltip />
<el-table-column label="退款日期" prop="refund_date" show-overflow-tooltip />
<el-table-column label="退款金额" prop="amount" show-overflow-tooltip />
<el-table-column label="退款方式" prop="refund_type" show-overflow-tooltip>
<template #default="{ row }">
<dict-value :options="dictData.refund_type" :value="row.refund_type" />
</template>
</el-table-column>
<el-table-column label="退款人" prop="refunder" show-overflow-tooltip />
<el-table-column label="组织名称" prop="org_name" show-overflow-tooltip />
<el-table-column label="部门名称" prop="dept_name" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="项目编码" prop="project_code" show-overflow-tooltip />
<el-table-column label="事件名称" prop="name" show-overflow-tooltip />
<el-table-column label="发生时间" prop="happen_time" show-overflow-tooltip />
<el-table-column label="事件内容" prop="content" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
<el-table-column label="附件" prop="file" show-overflow-tooltip />
<el-table-column label="操作" width="150" fixed="right">
<template #default="{ row }">
<el-button v-perms="['refund.refund/edit']" type="primary" link @click="handleEdit(row)">
<el-button v-perms="['safety.safety_event/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['refund.refund/delete']" type="danger" link @click="handleDelete(row.id)">
<el-button v-perms="['safety.safety_event/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['refund.refund/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
@ -72,7 +66,7 @@
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apirefundapplyLists, apirefundapplyDelete, apirefundapplyDetail } from '@/api/refund'
import { safetyeventLists, safetyeventDelete, safetyeventDetail } from '@/api/safety_event'
import { timeFormat } from '@/utils/util'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
@ -87,8 +81,9 @@ const showDtail = ref(false)
//
const queryParams = reactive({
contract_no: '',
contract_name: '',
name: '',
happen_time: '',
})
@ -106,7 +101,7 @@ const handleSelectionChange = (val: any[]) => {
const { dictData } = useDictData('refund_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apirefundapplyLists,
fetchFun: safetyeventLists,
params: queryParams
})
@ -121,7 +116,7 @@ const handleAdd = async () => {
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await apirefundapplyDetail({ id: data.id })
let res = await safetyeventDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
@ -131,11 +126,11 @@ const handleEdit = async (data: any) => {
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apirefundapplyDelete({ id })
await safetyeventDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await apirefundapplyDetail({ id: data.id })
let res = await safetyeventDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()

View File

@ -2,83 +2,117 @@
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-steps :active="active" align-center style="margin-bottom: 20px;">
<el-step title="商务部发起" />
<el-step title="商务总监" />
<el-step title="财务经理" />
<el-step title="总经理" />
</el-steps>
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="客户名称" prop="customer_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="custom_name" @click="showDialog = true" clearable placeholder="请选择客户" />
<el-form-item label="组织名称" prop="org_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.org_id" clearable placeholder="请选择组织" @change="deptrmt">
<el-option v-for="(item, index) in list1" :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款日期" prop="return_date">
<el-date-picker class="flex-1 !flex" v-model="formData.return_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="contract_id" @click="showDialog1 = true">
<el-input v-model="project_name" clearable placeholder="请输入项目名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入项目编码" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号" prop="contract_no">
<el-input v-model="contract_no" clearable placeholder="请输入合同编号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称" prop="contract_name">
<el-input v-model="contract_name" clearable placeholder="请输入合同名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款原因" prop="reason">
<el-input v-model="formData.reason" type='textarea' clearable placeholder="请输入退款原因" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款金额" prop="amount">
<el-input v-model="formData.amount" clearable placeholder="请输入退款金额" @input="amountinput" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写" prop="amount_daxie">
<el-input v-model="formData.amount_daxie" readonly clearable placeholder="请输入金额大写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款方式" prop="contacts">
<el-select class="flex-1" v-model="formData.refund_type" clearable placeholder="请选择退款方式">
<el-option v-for="(item, index) in dictData.refund_type" :key="index" :label="item.name" :value="parseInt(item.value)" />
<el-form-item label="部门名称" prop="dept_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.dept_id" clearable placeholder="请选择部门">
<el-option v-for="( item, index ) in list2 " :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款人" prop="refunder">
<el-input v-model="formData.refunder" readonly clearable placeholder="请输入退款人" />
<el-form-item label="项目名称" prop="project_id" @click="showDialog = true">
<el-input v-model="project_name" clearable placeholder="请输入项目名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="填报单位" prop="fill_company">
<el-input v-model="formData.fill_company" clearable placeholder="请输入填报单位" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="8">
<el-form-item label="施工单位负责人" prop="construction_company_user">
<el-input v-model="formData.construction_company_user" clearable placeholder="请输入施工单位负责人" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="监理单位负责人" prop="supervision_company_user">
<el-input v-model="formData.supervision_company_user" clearable placeholder="请输入监理单位负责人" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="建设单位负责人" prop="build_company_user">
<el-input v-model="formData.build_company_user" clearable placeholder="请输入建设单位负责人" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="危险源" prop="source">
<el-input v-model="formData.source" clearable placeholder="请输入危险源" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="可能发生事故" prop="accident">
<el-input v-model="formData.accident" clearable placeholder="请输入可能发生事故" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="风险等级" prop="risk_level">
<el-input v-model="formData.risk_level" clearable placeholder="请输入风险等级" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="管控层级" prop="control_level">
<el-input v-model="formData.control_level" clearable placeholder="请输入管控层级" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="主责部门" prop="department">
<el-input v-model="formData.department" clearable placeholder="请输入主责部门" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="主要人员" prop="users">
<el-input v-model="formData.users" clearable placeholder="请输入主要人员" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="技术措施" prop="technical_measure">
<el-input v-model="formData.technical_measure" clearable placeholder="请输入技术措施" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="管理措施" prop="manage_measure">
<el-input v-model="formData.manage_measure" clearable placeholder="请输入管理措施" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="应急措施" prop="emergency_measure">
<el-input v-model="formData.emergency_measure" clearable placeholder="请输入应急措施" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附件" prop="field127">
@ -89,7 +123,7 @@
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<div v-for="( item, index ) in formDataannex " style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
@ -98,34 +132,11 @@
</el-form-item>
</el-col>
</el-row>
<div style="margin: 20px 0;">客户收款信息</div>
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="收款账号" prop="collection_acccount" @click="showDialog2 = true">
<el-input v-model="formData.collection_acccount" clearable placeholder="请输入收款账号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收款银行" prop="collection_bank">
<el-input v-model="formData.collection_bank" clearable placeholder="请输入收款银行" />
</el-form-item>
</el-col>
</el-row>
<el-dialog v-model="showDialog" title="选择客户" width="70%">
<customDialog @customEvent="customEvent"></customDialog>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<porjectDialog @customEvent="customEvent"></porjectDialog>
</el-dialog>
<el-dialog v-model="showDialog1" title="选择合同" width="70%">
<salescontractDialog @customEvent="customEvent1"></salescontractDialog>
</el-dialog>
</el-form>
@ -135,12 +146,10 @@
</template>
<script lang="ts" setup name="projectEdit">
import customDialog from '@/components/custom-dialog/index.vue'
import porjectDialog from '@/components/project/index.vue'
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import salescontractDialog from '@/components/salescontract/index.vue'
import { apirefundapplyAdd, apirefundapplyEdit, apirefundapplyDetail } from '@/api/refund'
import { safetyhazardAdd, safetyhazardEdit, safetyhazardDetail } from '@/api/safety_hazard'
import { toChinesNum } from "@/utils/util";
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
@ -153,14 +162,14 @@ const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const contract_name = ref('')
const list1 = reactive([])
const list2 = reactive([])
const showDialog = ref(false)
const project_name = ref('')
const project_code = ref('')
const project_amount = ref('')
const contract_no = ref('')
const custom_name = ref('')
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
const userInfo = userStore.userInfo
console.log(userInfo, '222222')
//
const handleAvatarSuccess_four = (
response,
@ -176,31 +185,7 @@ const handleAvatarSuccess_four = (
);
};
//
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
if (value && !/^1\d{10}$/.test(value)) {
callback(new Error('请输入正确的手机号码'));
} else {
callback()
}
}
const userEmail = (rule: any, value: string, callback: (arg0: Error | undefined) => void) => {
// const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
// // if (!value) {
// // return callback(new Error(''))
// // }
if (value && !mailReg.test(value)) {
callback(new Error('请输入正确的邮箱格式'))
} else {
callback()
}
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
@ -215,54 +200,63 @@ const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const amount_daxie = ref('')
const showDialog = ref(false)
const showDialog1 = ref(false)
//
const customEvent = (e: any) => {
formData.customer_id = e.id;
custom_name.value = e.name;
formData.project_id = e.id;
project_name.value = e.name;
showDialog.value = false;
};
const customEvent1 = (e: any) => {
formData.contract_id = e.id;
project_name.value = e.project_name;
project_code.value = e.project_code;
contract_name.value = e.contract_name;
contract_no.value = e.contract_code
showDialog1.value = false;
};
//
const getlist = () => {
getAll().then((res) => {
Object.assign(list1, res)
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.amount_daxie = toChinesNum(e)
}
})
}
//
const deptrmt = (e) => {
getlist1(e)
}
//
const getlist1 = (id: any) => {
deptAll({ 'org_id': id }).then((res) => {
Object.assign(list2, res)
})
}
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑退款申请表' : '新增退款申请表'
return mode.value == 'edit' ? '编辑危险源表' : '新增危险源表'
})
//
const formData = reactive({
id: '',
customer_id: "",
contract_id: "",
approve_id: 0,
refund_date: "",
reason: "",
amount: 0,
amount_daxie: "",
refund_type: "",
refunder: userInfo.name,
return_total_amount: "",
return_desc: "",
collection_bank: "",
collection_acccount: ""
file: '',
remark: '',
emergency_measure: '',
manage_measure: '',
technical_measure: '',
users: '',
department: '',
control_level: '',
risk_level: '',
accident: '',
source: '',
build_company_user: '',
supervision_company_user: '',
construction_company_user: '',
fill_company: '',
project_id: '',
dept_id: '',
org_id: '',
})
@ -274,9 +268,9 @@ const formRules = reactive<any>({
//
const setFormData = async (data: Record<any, any>) => {
if (data.return_desc && data.return_desc.length > 0) {
if (data.return_desc.includes(",")) {
const arry1 = data.return_desc.split(',').map((item: any, index: any) => {
if (data.file && data.file.length > 0) {
if (data.file.includes(",")) {
const arry1 = data.file.split(',').map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
@ -284,7 +278,7 @@ const setFormData = async (data: Record<any, any>) => {
});
Object.assign(formDataannex, arry1)
} else {
const arry1 = [{ name: `文件1`, uri: data.return_desc }]
const arry1 = [{ name: `文件1`, uri: data.file }]
Object.assign(formDataannex, arry1)
console.log(formDataannex)
@ -298,18 +292,17 @@ const setFormData = async (data: Record<any, any>) => {
formData[key] = data[key]
}
}
custom_name.value = data.custom.name
project_name.value = data.project.name
project_code.value = data.project.project_code
project_amount.value = data.contract.amount
contract_name.value = data.contract.contract_name;
contract_no.value = data.contract.contract_code
if (data.dept_id) {
getlist1(data.dept_id
)
}
project_name.value = data.project_name
}
const getDetail = async (row: Record<string, any>) => {
const data = await apirefundapplyDetail({
const data = await safetyhazardDetail({
id: row.id
})
setFormData(data)
@ -319,16 +312,16 @@ const getDetail = async (row: Record<string, any>) => {
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.return_desc = formDataannex.map((item: any) => item.uri).toString()
formData.file = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
console.log(formRef.value?.validate(), '22222222')
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await apirefundapplyEdit(data)
: await apirefundapplyAdd(data)
? await safetyhazardEdit(data)
: await safetyhazardAdd(data)
popupRef.value?.close()
emit('success')
}
@ -337,11 +330,8 @@ const handleSubmit = async () => {
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getlist()
getAllProjectTypes().then((res) => {
protype.splice(0, protype.length, ...res);
})
}
//

View File

@ -2,11 +2,26 @@
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="合同编号" prop="project_name">
<el-input class="w-[280px]" v-model="queryParams.contract_no" clearable placeholder="请输入合同编号" />
<el-form-item label="填报单位" prop="fill_company">
<el-input class="w-[280px]" v-model="queryParams.fill_company" clearable placeholder="请输入填报单位" />
</el-form-item>
<el-form-item label="合同名称" prop="project_role_name">
<el-input class="w-[280px]" v-model="queryParams.contract_name" clearable placeholder="请输入合同名称" />
<el-form-item label="施工单位负责人" prop="construction_company_user">
<el-input class="w-[280px]" v-model="queryParams.construction_company_user" clearable placeholder="请输入施工单位负责人" />
</el-form-item>
<el-form-item label="监理单位负责人" prop="supervision_company_user">
<el-input class="w-[280px]" v-model="queryParams.supervision_company_user" clearable placeholder="请输入监理单位负责人" />
</el-form-item>
<el-form-item label="建设单位负责人" prop="build_company_user">
<el-input class="w-[280px]" v-model="queryParams.build_company_user" clearable placeholder="请输入建设单位负责人" />
</el-form-item>
@ -17,42 +32,50 @@
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['refund.refund/add']" type="primary" @click="handleAdd">
<el-button v-perms="['safety.safety_hazard/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['refund.refund/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
<el-button v-perms="['safety.safety_hazard/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="退款单号" prop="project_name" show-overflow-tooltip />
<el-table-column label="客户名称" prop="project_code" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_role_name" show-overflow-tooltip />
<el-table-column label="合同编号" prop="admin_name" show-overflow-tooltip />
<el-table-column label="退款原因" prop="reason" show-overflow-tooltip />
<el-table-column label="退款日期" prop="refund_date" show-overflow-tooltip />
<el-table-column label="退款金额" prop="amount" show-overflow-tooltip />
<el-table-column label="退款方式" prop="refund_type" show-overflow-tooltip>
<template #default="{ row }">
<dict-value :options="dictData.refund_type" :value="row.refund_type" />
</template>
</el-table-column>
<el-table-column label="退款人" prop="refunder" show-overflow-tooltip />
<el-table-column label="组织名称" prop="org_name" show-overflow-tooltip />
<el-table-column label="部门名称" prop="dept_name" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="项目编码" prop="project_code" show-overflow-tooltip />
<el-table-column label="填报单位" prop="fill_company" show-overflow-tooltip />
<el-table-column label="施工单位负责人" prop="construction_company_user" show-overflow-tooltip />
<el-table-column label="监理单位负责人" prop="supervision_company_user" show-overflow-tooltip />
<el-table-column label="建设单位负责人" prop="build_company_user" show-overflow-tooltip />
<el-table-column label="危险源" prop="source" show-overflow-tooltip />
<el-table-column label="可能发生事故" prop="accident" show-overflow-tooltip />
<el-table-column label="风险等级" prop="control_level" show-overflow-tooltip />
<el-table-column label="管控层级" prop="build_company_user" show-overflow-tooltip />
<el-table-column label="主责部门" prop="department" show-overflow-tooltip />
<el-table-column label="主要人员" prop="users" show-overflow-tooltip />
<el-table-column label="技术措施" prop="technical_measure" show-overflow-tooltip />
<el-table-column label="管理措施" prop="manage_measure" show-overflow-tooltip />
<el-table-column label="应急措施" prop="emergency_measure" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
<el-table-column label="操作" width="150" fixed="right">
<template #default="{ row }">
<el-button v-perms="['refund.refund/edit']" type="primary" link @click="handleEdit(row)">
<el-button v-perms="['safety.safety_hazard/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['refund.refund/delete']" type="danger" link @click="handleDelete(row.id)">
<el-button v-perms="['safety.safety_hazard/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['refund.refund/detail']" link @click="handledetail(row)">
<el-button v-perms="['safety.safety_hazard/detail']" link @click="handledetail(row)">
详情
</el-button>
@ -72,7 +95,7 @@
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apirefundapplyLists, apirefundapplyDelete, apirefundapplyDetail } from '@/api/refund'
import { safetyhazardLists, safetyhazardDelete, safetyhazardDetail } from '@/api/safety_hazard'
import { timeFormat } from '@/utils/util'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
@ -87,8 +110,10 @@ const showDtail = ref(false)
//
const queryParams = reactive({
contract_no: '',
contract_name: '',
fill_company: '',
construction_company_user: '',
supervision_company_user: '',
build_company_user: '',
})
@ -106,7 +131,7 @@ const handleSelectionChange = (val: any[]) => {
const { dictData } = useDictData('refund_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apirefundapplyLists,
fetchFun: safetyhazardLists,
params: queryParams
})
@ -121,7 +146,7 @@ const handleAdd = async () => {
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await apirefundapplyDetail({ id: data.id })
let res = await safetyhazardDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
@ -131,11 +156,11 @@ const handleEdit = async (data: any) => {
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apirefundapplyDelete({ id })
await safetyhazardDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await apirefundapplyDetail({ id: data.id })
let res = await safetyhazardDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()

View File

@ -2,83 +2,111 @@
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-steps :active="active" align-center style="margin-bottom: 20px;">
<el-step title="商务部发起" />
<el-step title="商务总监" />
<el-step title="财务经理" />
<el-step title="总经理" />
</el-steps>
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="客户名称" prop="customer_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="custom_name" @click="showDialog = true" clearable placeholder="请选择客户" />
<el-form-item label="组织名称" prop="org_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.org_id" clearable placeholder="请选择组织" @change="deptrmt">
<el-option v-for="(item, index) in list1" :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款日期" prop="return_date">
<el-date-picker class="flex-1 !flex" v-model="formData.return_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择日期">
</el-date-picker>
<el-form-item label="部门名称" prop="dept_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.dept_id" clearable placeholder="请选择部门">
<el-option v-for="( item, index ) in list2 " :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="contract_id" @click="showDialog1 = true">
<el-form-item label="项目名称" prop="project_id" @click="showDialog = true">
<el-input v-model="project_name" clearable placeholder="请输入项目名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码" prop="contract_id">
<el-form-item label="项目编码" prop="project_id" @click="showDialog = true">
<el-input v-model="project_code" clearable placeholder="请输入项目编码" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号" prop="contract_no">
<el-input v-model="contract_no" clearable placeholder="请输入合同编号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称" prop="contract_name">
<el-input v-model="contract_name" clearable placeholder="请输入合同名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款原因" prop="reason">
<el-input v-model="formData.reason" type='textarea' clearable placeholder="请输入退款原因" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款金额" prop="amount">
<el-input v-model="formData.amount" clearable placeholder="请输入退款金额" @input="amountinput" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写" prop="amount_daxie">
<el-input v-model="formData.amount_daxie" readonly clearable placeholder="请输入金额大写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款方式" prop="contacts">
<el-select class="flex-1" v-model="formData.refund_type" clearable placeholder="请选择退款方式">
<el-option v-for="(item, index) in dictData.refund_type" :key="index" :label="item.name" :value="parseInt(item.value)" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款人" prop="refunder">
<el-input v-model="formData.refunder" readonly clearable placeholder="请输入退款人" />
<el-form-item label="检查性质" prop="check_nature">
<el-input v-model="formData.check_nature" clearable placeholder="请输入检查性质" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="8">
<el-form-item label="检查日期" prop="check_date">
<el-date-picker class="flex-1 !flex" v-model="formData.check_date" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择检查日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="整改期限" prop="modify_term">
<el-input v-model="formData.modify_term" clearable placeholder="请输入整改期限" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查人" prop="check_user">
<el-input v-model="formData.check_user" clearable placeholder="请输入检查人" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查单位" prop="check_company">
<el-input v-model="formData.check_company" clearable placeholder="请输入检查单位" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="整改单位" prop="modify_company">
<el-input v-model="formData.modify_company" clearable placeholder="请输入整改单位" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="责任人" prop="resp_user">
<el-input v-model="formData.resp_user" clearable placeholder="请输入责任人" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查项" prop="check_item">
<el-input v-model="formData.check_item" clearable placeholder="请输入检查项" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="安全隐患" prop="safety_hazard">
<el-input v-model="formData.safety_hazard" clearable placeholder="请输入安全隐患" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查结果" prop="check_result">
<el-input v-model="formData.check_result" clearable placeholder="请输入检查结果" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="整改人" prop="modify_user">
<el-input v-model="formData.modify_user" clearable placeholder="请输入整改人" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附件" prop="field127">
@ -89,7 +117,7 @@
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<div v-for="( item, index ) in formDataannex " style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
@ -98,49 +126,25 @@
</el-form-item>
</el-col>
</el-row>
<div style="margin: 20px 0;">客户收款信息</div>
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="收款账号" prop="collection_acccount" @click="showDialog2 = true">
<el-input v-model="formData.collection_acccount" clearable placeholder="请输入收款账号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收款银行" prop="collection_bank">
<el-input v-model="formData.collection_bank" clearable placeholder="请输入收款银行" />
</el-form-item>
</el-col>
</el-row>
<el-dialog v-model="showDialog" title="选择客户" width="70%">
<customDialog @customEvent="customEvent"></customDialog>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<porjectDialog @customEvent="customEvent"></porjectDialog>
</el-dialog>
<el-dialog v-model="showDialog1" title="选择合同" width="70%">
<salescontractDialog @customEvent="customEvent1"></salescontractDialog>
</el-dialog>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="projectEdit">
import customDialog from '@/components/custom-dialog/index.vue'
import porjectDialog from '@/components/project/index.vue'
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import salescontractDialog from '@/components/salescontract/index.vue'
import { apirefundapplyAdd, apirefundapplyEdit, apirefundapplyDetail } from '@/api/refund'
import { safetymodifyAdd, safetymodifyEdit, safetymodifyDetail } from '@/api/safety_check'
import { toChinesNum } from "@/utils/util";
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
@ -153,14 +157,14 @@ const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const contract_name = ref('')
const list1 = reactive([])
const list2 = reactive([])
const showDialog = ref(false)
const project_name = ref('')
const project_code = ref('')
const project_amount = ref('')
const contract_no = ref('')
const custom_name = ref('')
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
const userInfo = userStore.userInfo
console.log(userInfo, '222222')
//
const handleAvatarSuccess_four = (
response,
@ -176,31 +180,7 @@ const handleAvatarSuccess_four = (
);
};
//
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
if (value && !/^1\d{10}$/.test(value)) {
callback(new Error('请输入正确的手机号码'));
} else {
callback()
}
}
const userEmail = (rule: any, value: string, callback: (arg0: Error | undefined) => void) => {
// const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
// // if (!value) {
// // return callback(new Error(''))
// // }
if (value && !mailReg.test(value)) {
callback(new Error('请输入正确的邮箱格式'))
} else {
callback()
}
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
@ -215,54 +195,59 @@ const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const amount_daxie = ref('')
const showDialog = ref(false)
const showDialog1 = ref(false)
//
const customEvent = (e: any) => {
formData.customer_id = e.id;
custom_name.value = e.name;
formData.project_id = e.id;
project_name.value = e.name;
project_code.value = e.project_code
showDialog.value = false;
};
const customEvent1 = (e: any) => {
formData.contract_id = e.id;
project_name.value = e.project_name;
project_code.value = e.project_code;
contract_name.value = e.contract_name;
contract_no.value = e.contract_code
showDialog1.value = false;
};
//
const getlist = () => {
getAll().then((res) => {
Object.assign(list1, res)
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.amount_daxie = toChinesNum(e)
}
})
}
//
const deptrmt = (e) => {
getlist1(e)
}
//
const getlist1 = (id: any) => {
deptAll({ 'org_id': id }).then((res) => {
Object.assign(list2, res)
})
}
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑退款申请表' : '新增退款申请表'
return mode.value == 'edit' ? '编辑安全整改表' : '新增安全整改表'
})
//
const formData = reactive({
id: '',
customer_id: "",
contract_id: "",
approve_id: 0,
refund_date: "",
reason: "",
amount: 0,
amount_daxie: "",
refund_type: "",
refunder: userInfo.name,
return_total_amount: "",
return_desc: "",
collection_bank: "",
collection_acccount: ""
org_id: '',
dept_id: '',
project_id: '',
check_name: '',
check_date: '',
check_user: '',
check_company: '',
check_item: '',
check_result: '',
modify_company: '',
resp_user: '',
modify_user: '',
safety_hazard: '',
modify_term: '',
remark: '',
file: '',
check_nature: '',
})
@ -274,9 +259,9 @@ const formRules = reactive<any>({
//
const setFormData = async (data: Record<any, any>) => {
if (data.return_desc && data.return_desc.length > 0) {
if (data.return_desc.includes(",")) {
const arry1 = data.return_desc.split(',').map((item: any, index: any) => {
if (data.file && data.file.length > 0) {
if (data.file.includes(",")) {
const arry1 = data.file.split(',').map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
@ -284,7 +269,7 @@ const setFormData = async (data: Record<any, any>) => {
});
Object.assign(formDataannex, arry1)
} else {
const arry1 = [{ name: `文件1`, uri: data.return_desc }]
const arry1 = [{ name: `文件1`, uri: data.file }]
Object.assign(formDataannex, arry1)
console.log(formDataannex)
@ -298,18 +283,17 @@ const setFormData = async (data: Record<any, any>) => {
formData[key] = data[key]
}
}
custom_name.value = data.custom.name
project_name.value = data.project.name
project_code.value = data.project.project_code
project_amount.value = data.contract.amount
contract_name.value = data.contract.contract_name;
contract_no.value = data.contract.contract_code
if (data.dept_id) {
getlist1(data.dept_id
)
}
project_name.value = data.project_name
project_code.value = data.project_code
}
const getDetail = async (row: Record<string, any>) => {
const data = await apirefundapplyDetail({
const data = await safetymodifyDetail({
id: row.id
})
setFormData(data)
@ -319,16 +303,16 @@ const getDetail = async (row: Record<string, any>) => {
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.return_desc = formDataannex.map((item: any) => item.uri).toString()
formData.file = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
console.log(formRef.value?.validate(), '22222222')
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await apirefundapplyEdit(data)
: await apirefundapplyAdd(data)
? await safetymodifyEdit(data)
: await safetymodifyAdd(data)
popupRef.value?.close()
emit('success')
}
@ -337,11 +321,8 @@ const handleSubmit = async () => {
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getlist()
getAllProjectTypes().then((res) => {
protype.splice(0, protype.length, ...res);
})
}
//

View File

@ -1,15 +1,35 @@
<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="合同编号" prop="project_name">
<el-input class="w-[280px]" v-model="queryParams.contract_no" clearable placeholder="请输入合同编号" />
</el-form-item>
<el-form-item label="合同名称" prop="project_role_name">
<el-input class="w-[280px]" v-model="queryParams.contract_name" clearable placeholder="请输入合同名称" />
</el-form-item>
<el-form class="mb-[-16px]" :model="queryParams" inline label-width="auto">
<el-form-item label="检查人" prop="check_user">
<el-input class="w-[280px]" v-model="queryParams.check_user" clearable placeholder="请输入检查人" />
</el-form-item>
<el-form-item label="检查单位" prop="check_company">
<el-input class="w-[280px]" v-model="queryParams.check_company" clearable placeholder="请输入检查单位" />
</el-form-item>
<el-form-item label="检查性质" prop="check_nature">
<el-input class="w-[280px]" v-model="queryParams.check_nature" clearable placeholder="请输入检查性质" />
</el-form-item>
<el-form-item label="整改期限" prop="modify_term">
<el-input class="w-[280px]" v-model="queryParams.modify_term" clearable placeholder="请输入整改期限" />
</el-form-item>
<el-form-item label="整改单位" prop="modify_company">
<el-input class="w-[280px]" v-model="queryParams.modify_company" clearable placeholder="请输入整改单位" />
</el-form-item>
<el-form-item label="整改人" prop="modify_user">
<el-input class="w-[280px]" v-model="queryParams.modify_user" clearable placeholder="请输入整改人" />
</el-form-item>
<el-form-item label="责任人" prop="resp_user">
<el-input class="w-[280px]" v-model="queryParams.resp_user" clearable placeholder="请输入责任人" />
</el-form-item>
<el-form-item label="检查日期" prop="check_date">
<el-date-picker class="w-[280px]" v-model="queryParams.check_date" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择检查日期">
</el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
@ -17,44 +37,46 @@
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['refund.refund/add']" type="primary" @click="handleAdd">
<el-button v-perms="['safety.safety_modify/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['refund.refund/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
<el-button v-perms="['safety.safety_modify/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="退款单号" prop="project_name" show-overflow-tooltip />
<el-table-column label="客户名称" prop="project_code" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_role_name" show-overflow-tooltip />
<el-table-column label="合同编号" prop="admin_name" show-overflow-tooltip />
<el-table-column label="退款原因" prop="reason" show-overflow-tooltip />
<el-table-column label="退款日期" prop="refund_date" show-overflow-tooltip />
<el-table-column label="退款金额" prop="amount" show-overflow-tooltip />
<el-table-column label="退款方式" prop="refund_type" show-overflow-tooltip>
<template #default="{ row }">
<dict-value :options="dictData.refund_type" :value="row.refund_type" />
</template>
</el-table-column>
<el-table-column label="退款人" prop="refunder" show-overflow-tooltip />
<el-table-column label="组织名称" prop="org_name" show-overflow-tooltip />
<el-table-column label="部门名称" prop="dept_name" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="项目编码" prop="project_code" show-overflow-tooltip />
<el-table-column label="检查日期" prop="check_date" show-overflow-tooltip />
<el-table-column label="整改期限" prop="modify_term" show-overflow-tooltip />
<el-table-column label="检查人" prop="check_user" show-overflow-tooltip />
<el-table-column label="检查单位" prop="check_company" show-overflow-tooltip />
<el-table-column label="整改单位" prop="modify_company" show-overflow-tooltip />
<el-table-column label="责任人" prop="resp_user" show-overflow-tooltip />
<el-table-column label="整改人" prop="modify_user" show-overflow-tooltip />
<el-table-column label="检查项" prop="check_item" show-overflow-tooltip />
<el-table-column label="安全隐患" prop="safety_hazard" show-overflow-tooltip />
<el-table-column label="检查性质" prop="check_nature" show-overflow-tooltip />
<el-table-column label="检查结果" prop="check_result" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
<el-table-column label="附件" prop="file" show-overflow-tooltip />
<el-table-column label="操作" width="150" fixed="right">
<template #default="{ row }">
<el-button v-perms="['refund.refund/edit']" type="primary" link @click="handleEdit(row)">
<el-button v-perms="['safety.safety_modify/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['refund.refund/delete']" type="danger" link @click="handleDelete(row.id)">
<el-button v-perms="['safety.safety_modify/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['refund.refund/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
@ -72,7 +94,7 @@
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apirefundapplyLists, apirefundapplyDelete, apirefundapplyDetail } from '@/api/refund'
import { safetymodifyLists, safetymodifyDelete, safetymodifyDetail } from '@/api/safety_check'
import { timeFormat } from '@/utils/util'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
@ -87,8 +109,14 @@ const showDtail = ref(false)
//
const queryParams = reactive({
contract_no: '',
contract_name: '',
check_nature: '',
check_date: '',
check_user: '',
check_company: '',
modify_term: '',
modify_company: '',
modify_user: '',
resp_user: '',
})
@ -106,7 +134,7 @@ const handleSelectionChange = (val: any[]) => {
const { dictData } = useDictData('refund_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apirefundapplyLists,
fetchFun: safetymodifyLists,
params: queryParams
})
@ -121,7 +149,7 @@ const handleAdd = async () => {
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await apirefundapplyDetail({ id: data.id })
let res = await safetymodifyDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
@ -131,11 +159,11 @@ const handleEdit = async (data: any) => {
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apirefundapplyDelete({ id })
await safetymodifyDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await apirefundapplyDetail({ id: data.id })
let res = await safetymodifyDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()

View File

@ -1,82 +1,72 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-steps :active="active" align-center style="margin-bottom: 20px;">
<el-step title="商务部发起" />
<el-step title="商务总监" />
<el-step title="财务经理" />
<el-step title="总经理" />
</el-steps>
<popup ref="popupRef" :title="popupTitle" :async="true" width="750px" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="客户名称" prop="customer_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="custom_name" @click="showDialog = true" clearable placeholder="请选择客户" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款日期" prop="return_date">
<el-date-picker class="flex-1 !flex" v-model="formData.return_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="contract_id" @click="showDialog1 = true">
<el-input v-model="project_name" clearable placeholder="请输入项目名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入项目编码" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号" prop="contract_no">
<el-input v-model="contract_no" clearable placeholder="请输入合同编号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称" prop="contract_name">
<el-input v-model="contract_name" clearable placeholder="请输入合同名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款原因" prop="reason">
<el-input v-model="formData.reason" type='textarea' clearable placeholder="请输入退款原因" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款金额" prop="amount">
<el-input v-model="formData.amount" clearable placeholder="请输入退款金额" @input="amountinput" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写" prop="amount_daxie">
<el-input v-model="formData.amount_daxie" readonly clearable placeholder="请输入金额大写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款方式" prop="contacts">
<el-select class="flex-1" v-model="formData.refund_type" clearable placeholder="请选择退款方式">
<el-option v-for="(item, index) in dictData.refund_type" :key="index" :label="item.name" :value="parseInt(item.value)" />
<el-col :span="24">
<el-form-item label="组织名称" prop="org_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.org_id" clearable placeholder="请选择组织" @change="deptrmt">
<el-option v-for="(item, index) in list1" :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款人" prop="refunder">
<el-input v-model="formData.refunder" readonly clearable placeholder="请输入退款人" />
<el-col :span="24">
<el-form-item label="部门名称" prop="dept_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.dept_id" clearable placeholder="请选择部门">
<el-option v-for="( item, index ) in list2 " :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="月份" prop="month">
<el-input v-model="formData.month" type="number" clearable placeholder="请输入月份" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="项目名称" prop="project_id" @click="showDialog = true">
<el-input v-model="project_name" clearable placeholder="请输入项目名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
<el-col :span="24">
<el-form-item label="负责人" prop="resp_user">
<el-input v-model="formData.resp_user" clearable placeholder="请输入负责人" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="分类" prop="classify">
<el-input v-model="formData.classify" clearable placeholder="请输入分类" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="隐患数量" prop="hazard_num">
<el-input v-model="formData.hazard_num" type="number" clearable placeholder="请输入隐患数量" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="数据统计" prop="data_statistics">
<el-input v-model="formData.data_statistics" type="number" clearable placeholder="请输入数据统计" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="本月重点工作" prop="current_important_work">
<el-input v-model="formData.current_important_work" clearable placeholder="请输入本月重点工作" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="下一阶段重点工作计划" prop="next_important_work">
<el-input v-model="formData.next_important_work" type="textarea" clearable placeholder="请输入下一阶段重点工作计划" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="需报告说明或协调的事项" prop="item">
<el-input v-model="formData.item" type="textarea" clearable placeholder="请输入需报告说明或协调的事项" />
</el-form-item>
</el-col>
<el-col :span="24">
@ -89,7 +79,7 @@
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<div v-for="( item, index ) in formDataannex " style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
@ -98,34 +88,11 @@
</el-form-item>
</el-col>
</el-row>
<div style="margin: 20px 0;">客户收款信息</div>
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="收款账号" prop="collection_acccount" @click="showDialog2 = true">
<el-input v-model="formData.collection_acccount" clearable placeholder="请输入收款账号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收款银行" prop="collection_bank">
<el-input v-model="formData.collection_bank" clearable placeholder="请输入收款银行" />
</el-form-item>
</el-col>
</el-row>
<el-dialog v-model="showDialog" title="选择客户" width="70%">
<customDialog @customEvent="customEvent"></customDialog>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<porjectDialog @customEvent="customEvent"></porjectDialog>
</el-dialog>
<el-dialog v-model="showDialog1" title="选择合同" width="70%">
<salescontractDialog @customEvent="customEvent1"></salescontractDialog>
</el-dialog>
</el-form>
@ -135,12 +102,10 @@
</template>
<script lang="ts" setup name="projectEdit">
import customDialog from '@/components/custom-dialog/index.vue'
import porjectDialog from '@/components/project/index.vue'
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import salescontractDialog from '@/components/salescontract/index.vue'
import { apirefundapplyAdd, apirefundapplyEdit, apirefundapplyDetail } from '@/api/refund'
import { safetyproductmonthAdd, safetyproductmonthEdit, safetyproductmonthDetail } from '@/api/safety_product_month'
import { toChinesNum } from "@/utils/util";
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
@ -153,14 +118,14 @@ const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const contract_name = ref('')
const list1 = reactive([])
const list2 = reactive([])
const showDialog = ref(false)
const project_name = ref('')
const project_code = ref('')
const project_amount = ref('')
const contract_no = ref('')
const custom_name = ref('')
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
const userInfo = userStore.userInfo
console.log(userInfo, '222222')
//
const handleAvatarSuccess_four = (
response,
@ -176,31 +141,7 @@ const handleAvatarSuccess_four = (
);
};
//
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
if (value && !/^1\d{10}$/.test(value)) {
callback(new Error('请输入正确的手机号码'));
} else {
callback()
}
}
const userEmail = (rule: any, value: string, callback: (arg0: Error | undefined) => void) => {
// const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
// // if (!value) {
// // return callback(new Error(''))
// // }
if (value && !mailReg.test(value)) {
callback(new Error('请输入正确的邮箱格式'))
} else {
callback()
}
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
@ -215,54 +156,54 @@ const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const amount_daxie = ref('')
const showDialog = ref(false)
const showDialog1 = ref(false)
//
const customEvent = (e: any) => {
formData.customer_id = e.id;
custom_name.value = e.name;
formData.project_id = e.id;
project_name.value = e.name;
project_code.value = e.project_code
showDialog.value = false;
};
const customEvent1 = (e: any) => {
formData.contract_id = e.id;
project_name.value = e.project_name;
project_code.value = e.project_code;
contract_name.value = e.contract_name;
contract_no.value = e.contract_code
showDialog1.value = false;
};
//
const getlist = () => {
getAll().then((res) => {
Object.assign(list1, res)
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.amount_daxie = toChinesNum(e)
}
})
}
//
const deptrmt = (e) => {
getlist1(e)
}
//
const getlist1 = (id: any) => {
deptAll({ 'org_id': id }).then((res) => {
Object.assign(list2, res)
})
}
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑退款申请表' : '新增退款申请表'
return mode.value == 'edit' ? '编辑安全生产月表' : '新增安全生产月表'
})
//
const formData = reactive({
id: '',
customer_id: "",
contract_id: "",
approve_id: 0,
refund_date: "",
reason: "",
amount: 0,
amount_daxie: "",
refund_type: "",
refunder: userInfo.name,
return_total_amount: "",
return_desc: "",
collection_bank: "",
collection_acccount: ""
project_id: "",
month: "",
resp_user: "",
classify: "",
hazard_num: "",
data_statistics: "",
current_important_work: "",
next_important_work: "",
item: "",
file: '',
remark: "",
dept_id: '',
org_id: "",
})
@ -274,9 +215,9 @@ const formRules = reactive<any>({
//
const setFormData = async (data: Record<any, any>) => {
if (data.return_desc && data.return_desc.length > 0) {
if (data.return_desc.includes(",")) {
const arry1 = data.return_desc.split(',').map((item: any, index: any) => {
if (data.file && data.file.length > 0) {
if (data.file.includes(",")) {
const arry1 = data.file.split(',').map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
@ -284,13 +225,16 @@ const setFormData = async (data: Record<any, any>) => {
});
Object.assign(formDataannex, arry1)
} else {
const arry1 = [{ name: `文件1`, uri: data.return_desc }]
const arry1 = [{ name: `文件1`, uri: data.file }]
Object.assign(formDataannex, arry1)
console.log(formDataannex)
}
}
if (data.dept_id) {
getlist1(data.dept_id
)
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
@ -298,18 +242,14 @@ const setFormData = async (data: Record<any, any>) => {
formData[key] = data[key]
}
}
custom_name.value = data.custom.name
project_name.value = data.project.name
project_code.value = data.project.project_code
project_amount.value = data.contract.amount
contract_name.value = data.contract.contract_name;
contract_no.value = data.contract.contract_code
project_name.value = data.project_name
project_code.value = data.project_code
}
const getDetail = async (row: Record<string, any>) => {
const data = await apirefundapplyDetail({
const data = await safetyproductmonthDetail({
id: row.id
})
setFormData(data)
@ -319,16 +259,16 @@ const getDetail = async (row: Record<string, any>) => {
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.return_desc = formDataannex.map((item: any) => item.uri).toString()
formData.file = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
console.log(formRef.value?.validate(), '22222222')
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await apirefundapplyEdit(data)
: await apirefundapplyAdd(data)
? await safetyproductmonthEdit(data)
: await safetyproductmonthAdd(data)
popupRef.value?.close()
emit('success')
}
@ -337,11 +277,8 @@ const handleSubmit = async () => {
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getlist()
getAllProjectTypes().then((res) => {
protype.splice(0, protype.length, ...res);
})
}
//

View File

@ -2,14 +2,13 @@
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="合同编号" prop="project_name">
<el-input class="w-[280px]" v-model="queryParams.contract_no" clearable placeholder="请输入合同编号" />
</el-form-item>
<el-form-item label="合同名称" prop="project_role_name">
<el-input class="w-[280px]" v-model="queryParams.contract_name" clearable placeholder="请输入合同名称" />
</el-form-item>
<el-form-item label="负责人" prop="resp_user">
<el-input v-model="queryParams.resp_user" clearable placeholder="请输入负责人" />
</el-form-item>
<el-form-item label="月份" prop="month">
<el-input v-model="queryParams.month" type="number" clearable placeholder="请输入月份" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
@ -17,44 +16,41 @@
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['refund.refund/add']" type="primary" @click="handleAdd">
<el-button v-perms="['safety.safety_product_month/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['refund.refund/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
<el-button v-perms="['safety.safety_product_month/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="退款单号" prop="project_name" show-overflow-tooltip />
<el-table-column label="客户名称" prop="project_code" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_role_name" show-overflow-tooltip />
<el-table-column label="合同编号" prop="admin_name" show-overflow-tooltip />
<el-table-column label="退款原因" prop="reason" show-overflow-tooltip />
<el-table-column label="退款日期" prop="refund_date" show-overflow-tooltip />
<el-table-column label="退款金额" prop="amount" show-overflow-tooltip />
<el-table-column label="退款方式" prop="refund_type" show-overflow-tooltip>
<template #default="{ row }">
<dict-value :options="dictData.refund_type" :value="row.refund_type" />
</template>
</el-table-column>
<el-table-column label="退款人" prop="refunder" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
<el-table-column label="组织名称" prop="org_name" show-overflow-tooltip />
<el-table-column label="部门名称" prop="dept_name" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<el-table-column label="月份" prop="month" show-overflow-tooltip />
<el-table-column label="负责人" prop="resp_user" show-overflow-tooltip />
<el-table-column label="分类" prop="classify" show-overflow-tooltip />
<el-table-column label="隐患数量" prop="hazard_num" show-overflow-tooltip />
<el-table-column label="数据统计" prop="data_statistics" show-overflow-tooltip />
<el-table-column label="本月重点工作" width="155" prop="current_important_work" show-overflow-tooltip />
<el-table-column label="下一阶段重点工作计划" width="165" prop="next_important_work" show-overflow-tooltip />
<el-table-column label="需报告说明或协调的事项" width="185" prop="item" show-overflow-tooltip />
<el-table-column label="附件" prop="file" show-overflow-tooltip />
<el-table-column label="操作" width="150" fixed="right">
<template #default="{ row }">
<el-button v-perms="['refund.refund/edit']" type="primary" link @click="handleEdit(row)">
<el-button v-perms="['safety.safety_product_month/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['refund.refund/delete']" type="danger" link @click="handleDelete(row.id)">
<el-button v-perms="['safety.safety_product_month/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['refund.refund/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
@ -72,7 +68,7 @@
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apirefundapplyLists, apirefundapplyDelete, apirefundapplyDetail } from '@/api/refund'
import { safetyproductmonthLists, safetyproductmonthDelete, safetyproductmonthDetail } from '@/api/safety_product_month'
import { timeFormat } from '@/utils/util'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
@ -87,8 +83,8 @@ const showDtail = ref(false)
//
const queryParams = reactive({
contract_no: '',
contract_name: '',
month: '',
resp_user: '',
})
@ -106,7 +102,7 @@ const handleSelectionChange = (val: any[]) => {
const { dictData } = useDictData('refund_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apirefundapplyLists,
fetchFun: safetyproductmonthLists,
params: queryParams
})
@ -121,7 +117,7 @@ const handleAdd = async () => {
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await apirefundapplyDetail({ id: data.id })
let res = await safetyproductmonthDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
@ -131,11 +127,11 @@ const handleEdit = async (data: any) => {
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apirefundapplyDelete({ id })
await safetyproductmonthDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await apirefundapplyDetail({ id: data.id })
let res = await safetyproductmonthDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()

View File

@ -1,84 +1,55 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-steps :active="active" align-center style="margin-bottom: 20px;">
<el-step title="商务部发起" />
<el-step title="商务总监" />
<el-step title="财务经理" />
<el-step title="总经理" />
</el-steps>
<popup ref="popupRef" :title="popupTitle" :async="true" width="550px" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="客户名称" prop="customer_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="custom_name" @click="showDialog = true" clearable placeholder="请选择客户" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款日期" prop="return_date">
<el-date-picker class="flex-1 !flex" v-model="formData.return_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="contract_id" @click="showDialog1 = true">
<el-input v-model="project_name" clearable placeholder="请输入项目名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入项目编码" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号" prop="contract_no">
<el-input v-model="contract_no" clearable placeholder="请输入合同编号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称" prop="contract_name">
<el-input v-model="contract_name" clearable placeholder="请输入合同名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款原因" prop="reason">
<el-input v-model="formData.reason" type='textarea' clearable placeholder="请输入退款原因" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款金额" prop="amount">
<el-input v-model="formData.amount" clearable placeholder="请输入退款金额" @input="amountinput" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写" prop="amount_daxie">
<el-input v-model="formData.amount_daxie" readonly clearable placeholder="请输入金额大写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款方式" prop="contacts">
<el-select class="flex-1" v-model="formData.refund_type" clearable placeholder="请选择退款方式">
<el-option v-for="(item, index) in dictData.refund_type" :key="index" :label="item.name" :value="parseInt(item.value)" />
<el-col :span="24">
<el-form-item label="组织名称" prop="org_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.org_id" clearable placeholder="请选择组织" @change="deptrmt">
<el-option v-for="(item, index) in list1" :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款人" prop="refunder">
<el-input v-model="formData.refunder" readonly clearable placeholder="请输入退款人" />
<el-col :span="24">
<el-form-item label="部门名称" prop="dept_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.dept_id" clearable placeholder="请选择部门">
<el-option v-for="( item, index ) in list2 " :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="项目名称" prop="project_id" @click="showDialog = true">
<el-input v-model="project_name" clearable placeholder="请输入项目名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="24">
<el-form-item label="名称" prop="name">
<el-input v-model="formData.name" clearable placeholder="请输入名称" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="内容" prop="content">
<el-input v-model="formData.content" type="textarea" clearable placeholder="请输入内容" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="发生时间" prop="require">
<el-date-picker v-model="formData.happen_date" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择发生时间">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附件" prop="field127">
@ -89,7 +60,7 @@
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<div v-for="( item, index ) in formDataannex " style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
@ -98,34 +69,11 @@
</el-form-item>
</el-col>
</el-row>
<div style="margin: 20px 0;">客户收款信息</div>
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="收款账号" prop="collection_acccount" @click="showDialog2 = true">
<el-input v-model="formData.collection_acccount" clearable placeholder="请输入收款账号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收款银行" prop="collection_bank">
<el-input v-model="formData.collection_bank" clearable placeholder="请输入收款银行" />
</el-form-item>
</el-col>
</el-row>
<el-dialog v-model="showDialog" title="选择客户" width="70%">
<customDialog @customEvent="customEvent"></customDialog>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<porjectDialog @customEvent="customEvent"></porjectDialog>
</el-dialog>
<el-dialog v-model="showDialog1" title="选择合同" width="70%">
<salescontractDialog @customEvent="customEvent1"></salescontractDialog>
</el-dialog>
</el-form>
@ -135,12 +83,10 @@
</template>
<script lang="ts" setup name="projectEdit">
import customDialog from '@/components/custom-dialog/index.vue'
import porjectDialog from '@/components/project/index.vue'
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import salescontractDialog from '@/components/salescontract/index.vue'
import { apirefundapplyAdd, apirefundapplyEdit, apirefundapplyDetail } from '@/api/refund'
import { safetyrehearsalAdd, safetyrehearsalEdit, safetyrehearsalDetail } from '@/api/safety_rehearsal'
import { toChinesNum } from "@/utils/util";
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
@ -153,14 +99,14 @@ const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const contract_name = ref('')
const list1 = reactive([])
const list2 = reactive([])
const showDialog = ref(false)
const project_name = ref('')
const project_code = ref('')
const project_amount = ref('')
const contract_no = ref('')
const custom_name = ref('')
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
const userInfo = userStore.userInfo
console.log(userInfo, '222222')
//
const handleAvatarSuccess_four = (
response,
@ -176,31 +122,7 @@ const handleAvatarSuccess_four = (
);
};
//
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
if (value && !/^1\d{10}$/.test(value)) {
callback(new Error('请输入正确的手机号码'));
} else {
callback()
}
}
const userEmail = (rule: any, value: string, callback: (arg0: Error | undefined) => void) => {
// const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
// // if (!value) {
// // return callback(new Error(''))
// // }
if (value && !mailReg.test(value)) {
callback(new Error('请输入正确的邮箱格式'))
} else {
callback()
}
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
@ -215,54 +137,49 @@ const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const amount_daxie = ref('')
const showDialog = ref(false)
const showDialog1 = ref(false)
//
const customEvent = (e: any) => {
formData.customer_id = e.id;
custom_name.value = e.name;
formData.project_id = e.id;
project_name.value = e.name;
project_code.value = e.project_code
showDialog.value = false;
};
const customEvent1 = (e: any) => {
formData.contract_id = e.id;
project_name.value = e.project_name;
project_code.value = e.project_code;
contract_name.value = e.contract_name;
contract_no.value = e.contract_code
showDialog1.value = false;
};
//
const getlist = () => {
getAll().then((res) => {
Object.assign(list1, res)
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.amount_daxie = toChinesNum(e)
}
})
}
//
const deptrmt = (e) => {
getlist1(e)
}
//
const getlist1 = (id: any) => {
deptAll({ 'org_id': id }).then((res) => {
Object.assign(list2, res)
})
}
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑退款申请表' : '新增退款申请表'
return mode.value == 'edit' ? '编辑安全演练表' : '新增安全评估表'
})
//
const formData = reactive({
id: '',
customer_id: "",
contract_id: "",
approve_id: 0,
refund_date: "",
reason: "",
amount: 0,
amount_daxie: "",
refund_type: "",
refunder: userInfo.name,
return_total_amount: "",
return_desc: "",
collection_bank: "",
collection_acccount: ""
project_id: "",
name: "",
happen_date: "",
content: "",
file: '',
remark: "",
dept_id: '',
org_id: "",
})
@ -274,9 +191,9 @@ const formRules = reactive<any>({
//
const setFormData = async (data: Record<any, any>) => {
if (data.return_desc && data.return_desc.length > 0) {
if (data.return_desc.includes(",")) {
const arry1 = data.return_desc.split(',').map((item: any, index: any) => {
if (data.file && data.file.length > 0) {
if (data.file.includes(",")) {
const arry1 = data.file.split(',').map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
@ -284,13 +201,16 @@ const setFormData = async (data: Record<any, any>) => {
});
Object.assign(formDataannex, arry1)
} else {
const arry1 = [{ name: `文件1`, uri: data.return_desc }]
const arry1 = [{ name: `文件1`, uri: data.file }]
Object.assign(formDataannex, arry1)
console.log(formDataannex)
}
}
if (data.dept_id) {
getlist1(data.dept_id
)
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
@ -298,18 +218,14 @@ const setFormData = async (data: Record<any, any>) => {
formData[key] = data[key]
}
}
custom_name.value = data.custom.name
project_name.value = data.project.name
project_code.value = data.project.project_code
project_amount.value = data.contract.amount
contract_name.value = data.contract.contract_name;
contract_no.value = data.contract.contract_code
project_name.value = data.project_name
project_code.value = data.project_code
}
const getDetail = async (row: Record<string, any>) => {
const data = await apirefundapplyDetail({
const data = await safetyrehearsalDetail({
id: row.id
})
setFormData(data)
@ -319,16 +235,16 @@ const getDetail = async (row: Record<string, any>) => {
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.return_desc = formDataannex.map((item: any) => item.uri).toString()
formData.file = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
console.log(formRef.value?.validate(), '22222222')
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await apirefundapplyEdit(data)
: await apirefundapplyAdd(data)
? await safetyrehearsalEdit(data)
: await safetyrehearsalAdd(data)
popupRef.value?.close()
emit('success')
}
@ -337,11 +253,8 @@ const handleSubmit = async () => {
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getlist()
getAllProjectTypes().then((res) => {
protype.splice(0, protype.length, ...res);
})
}
//

View File

@ -2,13 +2,14 @@
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="合同编号" prop="project_name">
<el-input class="w-[280px]" v-model="queryParams.contract_no" clearable placeholder="请输入合同编号" />
</el-form-item>
<el-form-item label="合同名称" prop="project_role_name">
<el-input class="w-[280px]" v-model="queryParams.contract_name" clearable placeholder="请输入合同名称" />
</el-form-item>
<el-form-item label="名称" prop="name">
<el-input v-model="queryParams.name" clearable placeholder="请输入名称" />
</el-form-item>
<el-form-item label="发生时间" prop="require">
<el-date-picker v-model="queryParams.happen_date" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择发生时间">
</el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
@ -17,44 +18,36 @@
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['refund.refund/add']" type="primary" @click="handleAdd">
<el-button v-perms="['safety.safety_rehearsal/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['refund.refund/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
<el-button v-perms="['safety.safety_rehearsal/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="退款单号" prop="project_name" show-overflow-tooltip />
<el-table-column label="客户名称" prop="project_code" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_role_name" show-overflow-tooltip />
<el-table-column label="合同编号" prop="admin_name" show-overflow-tooltip />
<el-table-column label="退款原因" prop="reason" show-overflow-tooltip />
<el-table-column label="退款日期" prop="refund_date" show-overflow-tooltip />
<el-table-column label="退款金额" prop="amount" show-overflow-tooltip />
<el-table-column label="退款方式" prop="refund_type" show-overflow-tooltip>
<template #default="{ row }">
<dict-value :options="dictData.refund_type" :value="row.refund_type" />
</template>
</el-table-column>
<el-table-column label="退款人" prop="refunder" show-overflow-tooltip />
<el-table-column label="组织名称" prop="org_name" show-overflow-tooltip />
<el-table-column label="部门名称" prop="dept_name" show-overflow-tooltip />
<el-table-column label="所属项目" prop="project_name" show-overflow-tooltip />
<el-table-column label="名称" prop="name" show-overflow-tooltip />
<el-table-column label="发生时间" prop="happen_date" show-overflow-tooltip />
<el-table-column label="内容" prop="content" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
<el-table-column label="附件" prop="file" show-overflow-tooltip />
<el-table-column label="操作" width="150" fixed="right">
<template #default="{ row }">
<el-button v-perms="['refund.refund/edit']" type="primary" link @click="handleEdit(row)">
<el-button v-perms="['safety.safety_rehearsal/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['refund.refund/delete']" type="danger" link @click="handleDelete(row.id)">
<el-button v-perms="['safety.safety_rehearsal/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['refund.refund/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
@ -72,7 +65,7 @@
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apirefundapplyLists, apirefundapplyDelete, apirefundapplyDetail } from '@/api/refund'
import { safetyrehearsalLists, safetyrehearsalDelete, safetyrehearsalDetail } from '@/api/safety_rehearsal'
import { timeFormat } from '@/utils/util'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
@ -87,8 +80,8 @@ const showDtail = ref(false)
//
const queryParams = reactive({
contract_no: '',
contract_name: '',
name: '',
happen_date: '',
})
@ -106,7 +99,7 @@ const handleSelectionChange = (val: any[]) => {
const { dictData } = useDictData('refund_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apirefundapplyLists,
fetchFun: safetyrehearsalLists,
params: queryParams
})
@ -121,7 +114,7 @@ const handleAdd = async () => {
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await apirefundapplyDetail({ id: data.id })
let res = await safetyrehearsalDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
@ -131,11 +124,11 @@ const handleEdit = async (data: any) => {
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apirefundapplyDelete({ id })
await safetyrehearsalDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await apirefundapplyDetail({ id: data.id })
let res = await safetyrehearsalDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()

View File

@ -198,7 +198,10 @@ const setFormData = async (data: Record<any, any>) => {
formData[key] = data[key]
}
}
if (data.dept_id) {
getlist1(data.dept_id
)
}
@ -214,7 +217,7 @@ const getDetail = async (row: Record<string, any>) => {
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.file = formDataannex.map((item: any) => item.uri).toString()
formData.file = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
await formRef.value?.validate()

View File

@ -19,13 +19,13 @@
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['refund.refund/add']" type="primary" @click="handleAdd">
<el-button v-perms="['safety.safety_standard/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['refund.refund/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
<el-button v-perms="['safety.safety_standard/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
@ -38,21 +38,21 @@
<el-table-column label="规范名称" prop="name" show-overflow-tooltip />
<el-table-column label="规范类别" prop="type" show-overflow-tooltip />
<el-table-column label="发布部门" prop="publish_dep" show-overflow-tooltip />
<el-table-column label="内容" prop="amount" show-overflow-tooltip />
<el-table-column label="内容" prop="content" show-overflow-tooltip />
<el-table-column label="规范附件" prop="file" show-overflow-tooltip />
<el-table-column label="操作" width="150" fixed="right">
<template #default="{ row }">
<el-button v-perms="['refund.refund/edit']" type="primary" link @click="handleEdit(row)">
<el-button v-perms="['safety.safety_standard/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['refund.refund/delete']" type="danger" link @click="handleDelete(row.id)">
<el-button v-perms="['safety.safety_standard/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['refund.refund/detail']" link @click="handledetail(row)">
<!-- <el-button v-perms="['safety.safety_standard/detail']" link @click="handledetail(row)">
详情
</el-button>
</el-button> -->
</template>
</el-table-column>

View File

@ -1,84 +1,58 @@
<template>
<div class="edit-popup">
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
<el-steps :active="active" align-center style="margin-bottom: 20px;">
<el-step title="商务部发起" />
<el-step title="商务总监" />
<el-step title="财务经理" />
<el-step title="总经理" />
</el-steps>
<popup ref="popupRef" :title="popupTitle" :async="true" width="550px" @confirm="handleSubmit" @close="handleClose">
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="客户名称" prop="customer_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-input v-model="custom_name" @click="showDialog = true" clearable placeholder="请选择客户" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款日期" prop="return_date">
<el-date-picker class="flex-1 !flex" v-model="formData.return_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目名称" prop="contract_id" @click="showDialog1 = true">
<el-input v-model="project_name" clearable placeholder="请输入项目名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目编码" prop="contract_id">
<el-input v-model="project_code" clearable placeholder="请输入项目编码" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同编号" prop="contract_no">
<el-input v-model="contract_no" clearable placeholder="请输入合同编号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同名称" prop="contract_name">
<el-input v-model="contract_name" clearable placeholder="请输入合同名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款原因" prop="reason">
<el-input v-model="formData.reason" type='textarea' clearable placeholder="请输入退款原因" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款金额" prop="amount">
<el-input v-model="formData.amount" clearable placeholder="请输入退款金额" @input="amountinput" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额大写" prop="amount_daxie">
<el-input v-model="formData.amount_daxie" readonly clearable placeholder="请输入金额大写" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款方式" prop="contacts">
<el-select class="flex-1" v-model="formData.refund_type" clearable placeholder="请选择退款方式">
<el-option v-for="(item, index) in dictData.refund_type" :key="index" :label="item.name" :value="parseInt(item.value)" />
<el-col :span="24">
<el-form-item label="组织名称" prop="org_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.org_id" clearable placeholder="请选择组织" @change="deptrmt">
<el-option v-for="(item, index) in list1" :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="退款人" prop="refunder">
<el-input v-model="formData.refunder" readonly clearable placeholder="请输入退款人" />
<el-col :span="24">
<el-form-item label="部门名称" prop="dept_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
<el-select v-model="formData.dept_id" clearable placeholder="请选择部门">
<el-option v-for="( item, index ) in list2 " :key="index" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="监督名称" prop="name">
<el-input v-model="formData.name" clearable placeholder="请输入监督名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="24">
<el-form-item label="项目名称" prop="project_name">
<el-input v-model="formData.project_name" clearable placeholder="请输入项目名称" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="发生时间" prop="require">
<el-date-picker class="flex-1 !flex" v-model="formData.happen_time" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择发生时间">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="设备事故" prop="device_accident">
<el-input v-model="formData.device_accident" clearable placeholder="请输入设备事故" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" clearable placeholder="请输入备注" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附件" prop="field127">
@ -89,7 +63,7 @@
</el-upload>
<div>
<div v-for="(item, index) in formDataannex" style="margin-left: 5px;display: block;">
<div v-for="( item, index ) in formDataannex " style="margin-left: 5px;display: block;">
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
</div>
@ -98,34 +72,11 @@
</el-form-item>
</el-col>
</el-row>
<div style="margin: 20px 0;">客户收款信息</div>
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="收款账号" prop="collection_acccount" @click="showDialog2 = true">
<el-input v-model="formData.collection_acccount" clearable placeholder="请输入收款账号" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="收款银行" prop="collection_bank">
<el-input v-model="formData.collection_bank" clearable placeholder="请输入收款银行" />
</el-form-item>
</el-col>
</el-row>
<el-dialog v-model="showDialog" title="选择客户" width="70%">
<customDialog @customEvent="customEvent"></customDialog>
<el-dialog v-model="showDialog" title="选择项目" width="70%">
<porjectDialog @customEvent="customEvent"></porjectDialog>
</el-dialog>
<el-dialog v-model="showDialog1" title="选择合同" width="70%">
<salescontractDialog @customEvent="customEvent1"></salescontractDialog>
</el-dialog>
</el-form>
@ -135,12 +86,10 @@
</template>
<script lang="ts" setup name="projectEdit">
import customDialog from '@/components/custom-dialog/index.vue'
import porjectDialog from '@/components/project/index.vue'
import type { FormInstance } from 'element-plus'
import Popup from '@/components/popup/index.vue'
import salescontractDialog from '@/components/salescontract/index.vue'
import { apirefundapplyAdd, apirefundapplyEdit, apirefundapplyDetail } from '@/api/refund'
import { safetysuperviseAdd, safetysuperviseEdit, safetysuperviseDetail } from '@/api/safety_supervise'
import { toChinesNum } from "@/utils/util";
import { getAllProjectTypes } from '@/api/projecttype'
import { timeFormat } from '@/utils/util'
@ -153,14 +102,14 @@ const base_url = configs.baseUrl + configs.urlPrefix
const userStore = useUserStore();
const active = ref(0)
const formDataannex = reactive([])
const contract_name = ref('')
const list1 = reactive([])
const list2 = reactive([])
const showDialog = ref(false)
const project_name = ref('')
const project_code = ref('')
const project_amount = ref('')
const contract_no = ref('')
const custom_name = ref('')
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
const userInfo = userStore.userInfo
console.log(userInfo, '222222')
//
const handleAvatarSuccess_four = (
response,
@ -176,31 +125,7 @@ const handleAvatarSuccess_four = (
);
};
//
const checkPhone = (rule: any, value: any, callback: (arg0: Error) => any) => {
if (value && !/^1\d{10}$/.test(value)) {
callback(new Error('请输入正确的手机号码'));
} else {
callback()
}
}
const userEmail = (rule: any, value: string, callback: (arg0: Error | undefined) => void) => {
// const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/
// // if (!value) {
// // return callback(new Error(''))
// // }
if (value && !mailReg.test(value)) {
callback(new Error('请输入正确的邮箱格式'))
} else {
callback()
}
};
//
const delFileFn = (index: number) => {
formDataannex.splice(index, 1)
@ -215,54 +140,50 @@ const emit = defineEmits(['success', 'close'])
const formRef = shallowRef<FormInstance>()
const popupRef = shallowRef<InstanceType<typeof Popup>>()
const mode = ref('add')
const amount_daxie = ref('')
const showDialog = ref(false)
const showDialog1 = ref(false)
//
const customEvent = (e: any) => {
formData.customer_id = e.id;
custom_name.value = e.name;
formData.project_id = e.id;
project_name.value = e.name;
project_code.value = e.project_code
showDialog.value = false;
};
const customEvent1 = (e: any) => {
formData.contract_id = e.id;
project_name.value = e.project_name;
project_code.value = e.project_code;
contract_name.value = e.contract_name;
contract_no.value = e.contract_code
showDialog1.value = false;
};
//
const getlist = () => {
getAll().then((res) => {
Object.assign(list1, res)
//
const amountinput = (e) => {
// console.log(e)
if (e && e > 0) {
formData.amount_daxie = toChinesNum(e)
}
})
}
//
const deptrmt = (e) => {
getlist1(e)
}
//
const getlist1 = (id: any) => {
deptAll({ 'org_id': id }).then((res) => {
Object.assign(list2, res)
})
}
//
const popupTitle = computed(() => {
return mode.value == 'edit' ? '编辑退款申请表' : '新增退款申请表'
return mode.value == 'edit' ? '编辑安全监督表' : '新增安全监督表'
})
//
const formData = reactive({
id: '',
customer_id: "",
contract_id: "",
approve_id: 0,
refund_date: "",
reason: "",
amount: 0,
amount_daxie: "",
refund_type: "",
refunder: userInfo.name,
return_total_amount: "",
return_desc: "",
collection_bank: "",
collection_acccount: ""
project_name: "",
name: "",
happen_time: "",
device_accident: "",
content: "",
file: '',
remark: "",
dept_id: '',
org_id: "",
})
@ -274,9 +195,9 @@ const formRules = reactive<any>({
//
const setFormData = async (data: Record<any, any>) => {
if (data.return_desc && data.return_desc.length > 0) {
if (data.return_desc.includes(",")) {
const arry1 = data.return_desc.split(',').map((item: any, index: any) => {
if (data.file && data.file.length > 0) {
if (data.file.includes(",")) {
const arry1 = data.file.split(',').map((item: any, index: any) => {
return {
name: `文件${index + 1}`,
uri: item
@ -284,32 +205,29 @@ const setFormData = async (data: Record<any, any>) => {
});
Object.assign(formDataannex, arry1)
} else {
const arry1 = [{ name: `文件1`, uri: data.return_desc }]
const arry1 = [{ name: `文件1`, uri: data.file }]
Object.assign(formDataannex, arry1)
console.log(formDataannex)
}
}
if (data.dept_id) {
getlist1(data.dept_id
)
}
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key]
}
}
custom_name.value = data.custom.name
project_name.value = data.project.name
project_code.value = data.project.project_code
project_amount.value = data.contract.amount
contract_name.value = data.contract.contract_name;
contract_no.value = data.contract.contract_code
}
const getDetail = async (row: Record<string, any>) => {
const data = await apirefundapplyDetail({
const data = await safetysuperviseDetail({
id: row.id
})
setFormData(data)
@ -319,16 +237,16 @@ const getDetail = async (row: Record<string, any>) => {
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.return_desc = formDataannex.map((item: any) => item.uri).toString()
formData.file = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
console.log(formRef.value?.validate(), '22222222')
await formRef.value?.validate()
const data = { ...formData }
mode.value == 'edit'
? await apirefundapplyEdit(data)
: await apirefundapplyAdd(data)
? await safetysuperviseEdit(data)
: await safetysuperviseAdd(data)
popupRef.value?.close()
emit('success')
}
@ -337,11 +255,8 @@ const handleSubmit = async () => {
const open = (type = 'add') => {
mode.value = type
popupRef.value?.open()
getlist()
getAllProjectTypes().then((res) => {
protype.splice(0, protype.length, ...res);
})
}
//

View File

@ -2,13 +2,21 @@
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" inline>
<el-form-item label="合同编号" prop="project_name">
<el-input class="w-[280px]" v-model="queryParams.contract_no" clearable placeholder="请输入合同编号" />
<el-form-item label="监督名称" prop="name">
<el-input class="w-[280px]" v-model="queryParams.name" clearable placeholder="请输入监督名称" />
</el-form-item>
<el-form-item label="合同名称" prop="project_role_name">
<el-input class="w-[280px]" v-model="queryParams.contract_name" clearable placeholder="请输入合同名称" />
<el-form-item label="项目名称" prop="project_name">
<el-input class="w-[280px]" v-model="queryParams.project_name" clearable placeholder="请输入项目名称" />
</el-form-item>
<el-form-item label="设备事故" prop="device_accident">
<el-input class="w-[280px]" v-model="queryParams.device_accident" clearable placeholder="请输入设备事故" />
</el-form-item>
<el-form-item label="发生时间" prop="require">
<el-date-picker class="w-[280px]" v-model="queryParams.happen_time" clearable type="date" value-format="YYYY-MM-DD" placeholder="选择发生时间">
</el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
@ -17,44 +25,37 @@
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['refund.refund/add']" type="primary" @click="handleAdd">
<el-button v-perms="['safety.safety_event/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['refund.refund/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
<el-button v-perms="['safety.safety_event/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="退款单号" prop="project_name" show-overflow-tooltip />
<el-table-column label="客户名称" prop="project_code" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_role_name" show-overflow-tooltip />
<el-table-column label="合同编号" prop="admin_name" show-overflow-tooltip />
<el-table-column label="退款原因" prop="reason" show-overflow-tooltip />
<el-table-column label="退款日期" prop="refund_date" show-overflow-tooltip />
<el-table-column label="退款金额" prop="amount" show-overflow-tooltip />
<el-table-column label="退款方式" prop="refund_type" show-overflow-tooltip>
<template #default="{ row }">
<dict-value :options="dictData.refund_type" :value="row.refund_type" />
</template>
</el-table-column>
<el-table-column label="退款人" prop="refunder" show-overflow-tooltip />
<el-table-column label="组织名称" prop="org_name" show-overflow-tooltip />
<el-table-column label="部门名称" prop="dept_name" show-overflow-tooltip />
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
<!-- <el-table-column label="项目编码" prop="project_code" show-overflow-tooltip /> -->
<el-table-column label="监督名称" prop="name" show-overflow-tooltip />
<el-table-column label="发生时间" prop="happen_time" show-overflow-tooltip />
<el-table-column label="设备事故" prop="device_accident" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" show-overflow-tooltip />
<el-table-column label="附件" prop="file" show-overflow-tooltip />
<el-table-column label="操作" width="150" fixed="right">
<template #default="{ row }">
<el-button v-perms="['refund.refund/edit']" type="primary" link @click="handleEdit(row)">
<el-button v-perms="['safety.safety_event/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['refund.refund/delete']" type="danger" link @click="handleDelete(row.id)">
<el-button v-perms="['safety.safety_event/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['refund.refund/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
@ -72,7 +73,7 @@
<script lang="ts" setup name="projectLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apirefundapplyLists, apirefundapplyDelete, apirefundapplyDetail } from '@/api/refund'
import { safetysuperviseLists, safetysuperviseDelete, safetysuperviseDetail } from '@/api/safety_supervise'
import { timeFormat } from '@/utils/util'
import { getAllProjectTypes } from '@/api/projecttype'
const protype = reactive([])
@ -87,9 +88,10 @@ const showDtail = ref(false)
//
const queryParams = reactive({
contract_no: '',
contract_name: '',
name: '',
happen_time: '',
device_accident: '',
project_name: '',
})
@ -106,7 +108,7 @@ const handleSelectionChange = (val: any[]) => {
const { dictData } = useDictData('refund_type')
//
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apirefundapplyLists,
fetchFun: safetysuperviseLists,
params: queryParams
})
@ -121,7 +123,7 @@ const handleAdd = async () => {
//
const handleEdit = async (data: any) => {
console.log(data.id)
let res = await apirefundapplyDetail({ id: data.id })
let res = await safetysuperviseDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
@ -131,11 +133,11 @@ const handleEdit = async (data: any) => {
//
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apirefundapplyDelete({ id })
await safetysuperviseDelete({ id })
getLists()
}
const handledetail = async (data: any) => {
let res = await apirefundapplyDetail({ id: data.id })
let res = await safetysuperviseDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()

View File

@ -117,7 +117,6 @@ const project_name = ref('')
import { deptAll } from '@/api/org/department'
import { getAll } from '@/api/org/organization'
const userInfo = userStore.userInfo
console.log(userInfo, '222222')
//
const handleAvatarSuccess_four = (
response,
@ -226,7 +225,10 @@ const setFormData = async (data: Record<any, any>) => {
formData[key] = data[key]
}
}
if (data.dept_id) {
getlist1(data.dept_id
)
}
project_name.value = data.project_name
@ -243,7 +245,7 @@ const getDetail = async (row: Record<string, any>) => {
//
const handleSubmit = async () => {
if (formDataannex.length > 0) {
formData.file = formDataannex.map((item: any) => item.uri).toString()
formData.file = JSON.stringify(formDataannex.map((item: any) => item.uri))
}
await formRef.value?.validate()

View File

@ -17,13 +17,13 @@
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['refund.refund/add']" type="primary" @click="handleAdd">
<el-button v-perms="['safety.safety_target/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<el-button v-perms="['refund.refund/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
<el-button v-perms="['safety.safety_target/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button>
@ -47,15 +47,15 @@
</el-table-column>
<el-table-column label="操作" width="150" fixed="right">
<template #default="{ row }">
<el-button v-perms="['refund.refund/edit']" type="primary" link @click="handleEdit(row)">
<el-button v-perms="['safety.safety_target/edit']" type="primary" link @click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['refund.refund/delete']" type="danger" link @click="handleDelete(row.id)">
<el-button v-perms="['safety.safety_target/delete']" type="danger" link @click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['refund.refund/detail']" link @click="handledetail(row)">
<!-- <el-button v-perms="['safety.safety_target/detail']" link @click="handledetail(row)">
详情
</el-button>
</el-button> -->
</template>
</el-table-column>