Merge branch 'feature' of https://gitea.lihaink.cn/mkm/TaskSystem-admin into feature

This commit is contained in:
chenbo 2023-11-17 17:20:32 +08:00
commit 4f523974e4
5 changed files with 723 additions and 1 deletions

View File

@ -1,6 +1,6 @@
NODE_ENV = 'development'
# VITE_APP_BASE_URL = 'http://192.168.1.12:8001'
# VITE_APP_BASE_URL = 'http://192.168.1.20:8000'
VITE_APP_BASE_URL = 'https://ceshi-worker-task.lihaink.cn'

View File

@ -0,0 +1,12 @@
import request from '@/utils/request'
// 商户合同列表
export function apiApproveLists(params: any) {
return request.get({ url: '/approve.approve/lists3', params })
}
// 任务审批(待审批列表)
export function apiApproveAudit(params: any) {
return request.post({ url: "/approve.approve/shareholderMoneyTaskAudit", params });
}

View File

@ -0,0 +1,291 @@
<template>
<div class="edit-popup">
<popup
ref="popupRef"
:title="popupTitle"
:async="true"
width="800px"
@confirm="handleSubmit"
@close="handleClose"
:button="mode == 'edit'"
:clickModalClose="mode == 'details'"
>
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="120px"
>
<el-row>
<el-col :span="12">
<el-form-item label="ID" prop="id">
<el-input readonly v-model="formData.id" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="任务名称" prop="task.title">
<el-input readonly v-model="formData.task.title" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="任务金额" prop="task.money">
<el-input readonly v-model="formData.task.money" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属公司" prop="company_name">
<el-input readonly v-model="formData.company_name" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="任务描述" prop="task.content">
<el-input
readonly
v-model="formData.task.content"
clearable
type="textarea"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="任务提交时间" prop="id">
<el-input readonly v-model="formData.task.update_time" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="片区经理" prop="flow_cate">
<el-input readonly v-model="formData.area_manager" />
</el-form-item>
</el-col>
</el-row>
<el-divider />
<el-row>
<el-col :span="24">
<el-form-item label="详情描述" prop="remark">
<el-input
readonly
:value="formData.task?.extend?.other?.note"
clearable
type="textarea"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="图片附件">
<el-image
class="attachment"
v-for="(item, index) in formData.task?.extend?.other?.annex"
:key="index"
:src="item"
:preview-src-list="formData.task?.extend?.other?.annex"
:initial-index="index"
fit="cover"
></el-image>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="视频附件">
<video
class="video"
:src="item"
v-for="(item, index) in formData.task?.extend?.other
?.video_annex"
:key="index"
controls
/>
</el-form-item>
</el-col>
</el-row>
<el-divider />
<!-- <el-col :span="24">
<el-form-item label="">
<el-timeline>
<el-timeline-item
v-for="(activity, index) in activities"
:key="index"
:type="activity.type"
:hollow="activity.hollow"
:timestamp="activity.timestamp"
>
{{ activity.content }}
</el-timeline-item>
</el-timeline>
</el-form-item>
</el-col> -->
<el-col :span="12">
<el-form-item
label="审核"
prop="check_status"
clearable
:style="{ width: '100%' }"
>
<el-radio-group
:disabled="mode == 'details'"
v-model="formData.check_status"
>
<el-radio :label="2">通过</el-radio>
<el-radio :label="3">驳回</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-row>
<el-col>
<el-form-item label="备注" prop="remark">
<el-input
:readonly="mode == 'details'"
v-model="formData.remark"
clearable
type="textarea"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="flowEdit">
import type { FormInstance } from "element-plus";
import Popup from "@/components/popup/index.vue";
import { apiApproveAudit } from "@/api/shareholdingReview";
import { timeFormat } from "@/utils/util";
import type { PropType } from "vue";
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({}),
},
});
const isCompany = ref(false);
const emit = defineEmits(["success", "close"]);
const formRef = shallowRef<FormInstance>();
const popupRef = shallowRef<InstanceType<typeof Popup>>();
const mode = ref("add");
//
const popupTitle = computed(() => {
return mode.value == "edit" ? "审核" : "详情";
});
const activities = ref([
{
content: "任务完成",
timestamp: "2023-8-28 13:30:00",
},
{
content: "张三三审核",
timestamp: "2023-8-28 13:30:00",
},
{
content: "李思思审核",
timestamp: "2023-8-28 13:30:00",
type: "primary",
hollow: true,
},
]);
//
const formData = reactive({
id: "",
task: {},
company_name: "",
area_manager: "",
check_status: 1,
remark: "",
});
//
const formRules = reactive<any>({
check_status: [
{
required: true,
validator: (rules: any, value: any, callback: any) => {
if (value != 2 && value != 3) callback("请选择审核状态");
else callback();
},
trigger: ["blur"],
},
],
// remark: [
// {
// required: false,
// validator: (rules: any, value: any, callback: any) => {
// if (formData.check_status == 3) callback("");
// else callback();
// },
// trigger: ["blur"],
// },
// ],
});
function customEvent(data: any) {
isCompany.value = false;
}
//
const setFormData = async (data: Record<any, any>) => {
// let res = await apiFlowDetil(data.id);
for (const key in formData) {
if (data[key] != null && data[key] != undefined) {
//@ts-ignore
formData[key] = data[key];
}
}
};
const getDetail = async (row: Record<string, any>) => {
// const data = await apiFlowDetail({
// id: row.id,
// });
// setFormData(data);
};
//
const handleSubmit = async () => {
await formRef.value?.validate();
if (formData.check_status == 3 && formData.remark == "")
return ElMessage.error("驳回必须填写备注");
await apiApproveAudit({
id: formData.id,
check_status: formData.check_status,
remark: formData.remark,
});
popupRef.value?.close();
emit("success");
};
//
const open = (type = "add") => {
mode.value = type;
popupRef.value?.open();
};
//
const handleClose = () => {
emit("close");
};
defineExpose({
open,
setFormData,
getDetail,
});
</script>
<style lang="scss" scoped>
:deep(.el-timeline-item__wrapper) {
top: -8px !important;
}
.attachment {
width: 150px;
height: 150px;
/* background-color: red; */
margin-right: 10px;
margin-bottom: 10px;
}
.video {
width: 300px;
height: 150px;
/* background-color: red; */
margin-right: 10px;
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,222 @@
<template>
<div class="edit-popup">
<popup
ref="popupRef"
:title="popupTitle"
:async="true"
width="800px"
@confirm="handleSubmit"
@close="handleClose"
:button="mode == 'edit'"
:clickModalClose="mode == 'details'"
>
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="120px"
>
<el-row>
<el-col :span="24">
<el-form-item label="参股公司:">
<div > {{ formData.company_b_name }}</div>
</el-form-item>
</el-col>
</el-row> <el-row>
<el-col :span="24">
<el-form-item label="被参股公司:">
<div > {{ formData.company_a_name }}</div>
</el-form-item>
</el-col>
</el-row> <el-row>
<el-col :span="24">
<el-form-item label="金额:">
<div > {{ taskExtend.amount }}</div>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="完成凭证:">
<div v-if="taskExtend.file_type=='image'" >
<el-image
style="width: 100px; height: 100px"
:src="taskExtend.annex"
:zoom-rate="1.2"
:max-scale="7"
:min-scale="0.2"
:preview-src-list="[taskExtend.annex]"
fit="cover"
/>
</div>
<div style="cursor: pointer;color:blue" v-else @click="annexFn(taskExtend.annex)"> 查看凭证</div>
</el-form-item>
</el-col>
</el-row>
<el-col :span="12">
<el-form-item
label="审核"
prop="check_status"
clearable
:style="{ width: '100%' }"
>
<el-radio-group
:class="{disabled:mode == 'details'}"
v-model="formData.check_status"
>
<el-radio :label="2">通过</el-radio>
<el-radio :label="3">驳回</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-row>
<el-col>
<el-form-item label="备注" prop="remark">
<el-input
:readonly="mode == 'details'"
v-model="formData.remark"
clearable
type="textarea"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
</popup>
</div>
</template>
<script lang="ts" setup name="flowEdit">
import type { FormInstance } from "element-plus";
import Popup from "@/components/popup/index.vue";
import { apiApproveAudit } from "@/api/shareholdingReview";
import type { PropType } from "vue";
defineProps({
dictData: {
type: Object as PropType<Record<string, any[]>>,
default: () => ({}),
},
});
const isCompany = ref(false);
const emit = defineEmits(["success", "close"]);
const formRef = shallowRef<FormInstance>();
const popupRef = shallowRef<InstanceType<typeof Popup>>();
const mode = ref("add");
//
const popupTitle = computed(() => {
return mode.value == "edit" ? "审核" : "详情";
});
const annexFn=(href:string)=>{
window.open(href, '_blank')
}
//
const formData = reactive({
id: "",
check_status: 1,
remark: "",
company_a_name:"",
company_b_name:"",
});
const taskExtend = reactive({
amount: "",
annex: "",
file_type:"",
});
//
const formRules = reactive<any>({
check_status: [
{
required: true,
validator: (rules: any, value: any, callback: any) => {
if (value != 2 && value != 3) callback("请选择审核状态");
else callback();
},
trigger: ["blur"],
},
],
});
//
const setFormData = async (data: Record<any, any>) => {
// console.log(data)
// return
formData.id=data.id
for ( let key in taskExtend){
//@ts-ignore
taskExtend[key]=JSON.parse(data.extend)[key]
}
formData.company_a_name=data.company_a_name
formData.company_b_name=data.company_b_name
if(mode.value=='details'){
formData.check_status=data.check_status
formData.remark=data.remark
}
};
//
const handleSubmit = async () => {
await formRef.value?.validate();
if (formData.check_status == 3 && formData.remark == "")
return ElMessage.error("驳回必须填写备注");
await apiApproveAudit({
id: formData.id,
check_status: formData.check_status,
remark: formData.remark,
});
popupRef.value?.close();
emit("success");
};
//
const open = (type = "add") => {
mode.value = type;
popupRef.value?.open();
};
//
const handleClose = () => {
emit("close");
};
defineExpose({
open,
setFormData,
});
</script>
<style lang="scss" scoped>
:deep(.el-timeline-item__wrapper) {
top: -8px !important;
}
.attachment {
width: 150px;
height: 150px;
/* background-color: red; */
margin-right: 10px;
margin-bottom: 10px;
}
.video {
width: 300px;
height: 150px;
/* background-color: red; */
margin-right: 10px;
margin-bottom: 10px;
}
.disabled{
pointer-events: none;
cursor: not-allowed;
}
</style>

View File

@ -0,0 +1,197 @@
<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="name">
<el-select
v-model="queryParams.check_status"
placeholder="请选择审核状态"
clearable
class="w-[280px]"
>
<el-option
v-for="(item, index) in checkStatusList"
:key="index"
:label="item.name"
:value="item.id"
></el-option>
</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">
<div class="mt-4">
<el-table :data="pager.lists" >
<el-table-column label="ID" width="100" prop="id" />
<el-table-column
label="参股公司"
prop="company_b_name"
width="500"
show-overflow-tooltip
align="center"
/>
<el-table-column
label="被参股公司"
prop="company_a_name"
show-overflow-tooltip
width="500"
align="center"
>
</el-table-column>
<el-table-column
label="参股金额"
prop="amount"
show-overflow-tooltip
>
</el-table-column>
<el-table-column label="备注" prop="remark" show-overflow-tooltip>
</el-table-column>
<el-table-column label="操作" width="120" fixed="right">
<template #default="{ row }">
<el-button
v-if="row.check_status <= 1"
v-perms="['flow/edit']"
type="primary"
link
@click="handleEdit(row, 'edit')"
>
审核
</el-button>
<el-button
v-else
type="primary"
link
@click="handleEdit(row, 'details')"
>
详情
</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>
<audit-other-popup
v-if="showEdit && showAuditOther"
ref="auditOtherRef"
:dict-data="dictData"
@success="getLists"
@close="showEdit = false"
/>
<audit-town-market-popup
v-else-if="showEdit && openType == 10"
ref="auditTownMarketRef"
:dict-data="dictData"
@success="getLists"
@close="showEdit = false"
/>
</div>
</template>
<script lang="ts" setup name="flowLists">
import { usePaging } from "@/hooks/usePaging";
import { useDictData } from "@/hooks/useDictOptions";
import { apiApproveLists } from "@/api/shareholdingReview";
import feedback from "@/utils/feedback";
import auditOtherPopup from "./components/audit_other.vue";
import auditTownMarketPopup from "./components/audit_town_market.vue";
const auditOtherRef = shallowRef<InstanceType<typeof auditOtherPopup>>();
const auditTownMarketRef =
shallowRef<InstanceType<typeof auditTownMarketPopup>>();
//
const showEdit = ref(false);
const openType = ref(1);
//
const queryParams = reactive({
name: "",
check_status: "",
type: "10",
});
const checkStatusList = ref([
{
id: 1,
name: "待审核",
},
{
id: 2,
name: "已通过",
},
{
id: 3,
name: "未通过",
},
]);
//
const showAuditTypeList = ref([1, 5, 6]);
const showAuditOther = computed(() => {
return showAuditTypeList.value.includes(openType.value);
});
//
const { dictData } = useDictData("");
//
//@ts-ignore
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apiApproveLists,
params: queryParams,
});
//
const handleAdd = async () => {
showEdit.value = true;
await nextTick();
auditOtherRef.value?.open("add");
};
//
const handleEdit = async (data: any, type = "edit") => {
openType.value = data.type;
showEdit.value = true;
await nextTick();
if (showAuditOther.value) {
auditOtherRef.value?.open(type);
auditOtherRef.value?.setFormData(data);
} else if (data.type == 10) {
auditTownMarketRef.value?.open(type);
auditTownMarketRef.value?.setFormData(data);
}
};
//
// const handleDelete = async (id: number | any[]) => {
// await feedback.confirm("");
// await apiFlowDelete({ id });
// getLists();
// };
// getTaskApproveTypeList().then((res) => {
// queryParams.type = res.join(",");
// });
getLists();
</script>