master
LiuJiaNan 2025-12-15 16:14:28 +08:00
parent 8cd5d14ed5
commit fb55a169ae
22 changed files with 769 additions and 1361 deletions

View File

@ -44,7 +44,7 @@ module.exports = {
// 开发服务
server: {
// 监听端口号
port: "8081",
port: "8085",
// 服务地址
host: "127.0.0.1",
// 是否自动打开浏览器

View File

@ -31,7 +31,7 @@
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-to-print": "^3.2.0",
"zy-react-library": "^1.0.134"
"zy-react-library": "^1.0.161"
},
"devDependencies": {
"@antfu/eslint-config": "^5.4.1",

View File

@ -55,14 +55,14 @@ export const busPromiseView = declareRequest(
"commitmentLoading",
`Get > /promise/busPromise/{id}`,
);
export const updateStatus = declareRequest(
"commitmentLoading",
"Put > @/promise/busPromise/updateStatus",
);
export const busPromisePeople = declareRequest(
"commitmentLoading",
"Post > @/promise/busPromisePeople/list",
);
export const busPromisePeopleAllSign = declareRequest(
"commitmentLoading",
"Get > /promise/busPromise/getSignPromisePeopleInfo/{id}",
);
export const busPromisePeopleView = declareRequest(
"commitmentLoading",
`Get > /promise/busPromisePeople/{id}`,

View File

@ -2,4 +2,7 @@
* 全局常量定义
*/
export const PROMISE_TYPE_ENUM = [{ name: "承诺书", bianma: "0" }, { name: "责任状", bianma: "1" }];
export const RELEASE_PLATFORM_ENUM = [{ name: "分公司", bianma: "1" }, { name: "股份内部", bianma: "2" }];
export {};

View File

@ -1,11 +1,13 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Col, Form, Input, message, Row } from "antd";
import { Form, message } from "antd";
import { useEffect } from "react";
import Editor from "zy-react-library/components/Editor";
import FormBuilder from "zy-react-library/components/FormBuilder";
import HeaderBack from "zy-react-library/components/HeaderBack";
import DictionarySelect from "zy-react-library/components/Select/Dictionary";
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
import { PROMISE_TYPE_ENUM } from "~/enumerate/constant";
import { NS_COMMITMENT } from "~/enumerate/namespace";
function Add(props) {
@ -14,12 +16,7 @@ function Add(props) {
const getData = async () => {
if (query.id) {
const { data } = await props["busPromiseTemplateView"]({ id: query.id });
const values = {
...data,
};
form.setFieldsValue({
...values,
});
form.setFieldsValue(data);
}
};
useEffect(() => {
@ -45,64 +42,23 @@ function Add(props) {
form={form}
values={{
templateDetails: [{}],
promiseType: 0,
promiseType: "0",
}}
onFinish={onSubmit}
options={[
{ name: "promiseName", label: "模板名称", span: 24 },
{ name: "promiseName", label: "安全承诺模板名称", span: 24 },
{
name: "promiseType",
label: "承诺类型",
label: "安全承诺类型",
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: [
{ name: "承诺书", bianma: 0 },
{ name: "责任书", bianma: 1 },
],
items: PROMISE_TYPE_ENUM,
componentProps: {
disabled: true,
},
},
{ name: "level", label: "承诺书级别", render: (<DictionarySelect dictValue="PROMISE_LEVEL" onGetLabel={label => form.setFieldValue("levelName", label)} />) },
{ name: "levelName", label: "承诺书级别", onlyForLabel: true },
{ name: "promiseText", label: "正文", span: 24, render: FORM_ITEM_RENDER_ENUM.TEXTAREA },
{ key: "templateDetails", span: 24, customizeRender: true, render: (
<>
<Form.List name="templateDetails">
{(fields, { add, remove }) => (
<>
{fields.map((field, index) => (
<Row gutter={24} key={field.key}>
<Col span={24}>
<Form.Item label="副文" required labelCol={{ span: 2 }} wrapperCol={{ span: 22 }}>
<div style={{ display: "flex", gap: 10 }}>
<Form.Item
noStyle
rules={
[
{ required: true, message: "请输入副文" },
]
}
name={[field.name, "collateral"]}
>
<Input.TextArea placeholder="请输入副文" rows={4} maxLength={500} />
</Form.Item>
{
index >= 1
? <Button type="primary" danger onClick={() => remove(field.name)}>删除</Button>
: <Button type="primary" onClick={() => add({ deptId: undefined, deptName: undefined, userId: undefined, userName: undefined, type: 300 })}>新增</Button>
}
</div>
</Form.Item>
</Col>
</Row>
))}
</>
)}
</Form.List>
</>
) },
{ name: "level", label: "安全承诺级别", render: (<DictionarySelect dictValue="PROMISE_LEVEL" onGetLabel={label => form.setFieldValue("levelName", label)} />) },
{ name: "levelName", label: "安全承诺级别名称", onlyForLabel: true },
{ name: "promiseText", label: "承诺内容", span: 24, render: <Editor /> },
]}
/>
</div>

View File

@ -1,3 +1,4 @@
import { Permission } from "@cqsjjb/jjb-common-decorator/permission";
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, message, Modal, Space } from "antd";
import { useState } from "react";
@ -36,27 +37,29 @@ function List(props) {
labelCol={{ span: 8 }}
form={form}
options={[
{ name: "hiddenDesc", label: "模板名称" },
{ name: "likePromiseName", label: "安全承诺模板名称" },
]}
onFinish={getData}
/>
<Table
toolBarRender={() => (
<>
<Button
type="primary"
icon={<AddIcon />}
onClick={() => {
props.history.push("./add");
}}
>
新增
</Button>
{props.permission("qy-promise-template-add") && (
<Button
type="primary"
icon={<AddIcon />}
onClick={() => {
props.history.push("./add");
}}
>
新增
</Button>
)}
</>
)}
columns={[
{ title: "模板名称", dataIndex: "promiseName" },
{ title: "承诺级别", dataIndex: "levelName" },
{ title: "安全承诺模板名称", dataIndex: "promiseName" },
{ title: "安全承诺级别", dataIndex: "levelName" },
{ title: "添加时间", dataIndex: "createTime" },
{
title: "操作",
@ -74,17 +77,21 @@ function List(props) {
>
查看
</Button>
<Button type="link" onClick={() => updatate(record.id, record.state)}>
{record.state === 0 ? "禁用" : "启用"}
</Button>
<Button
type="link"
onClick={() => {
props.history.push(`./add?id=${record.id}`);
}}
>
编辑
</Button>
{props.permission("qy-promise-template-disable") && (
<Button type="link" onClick={() => updatate(record.id, record.state)}>
{record.state === 0 ? "禁用" : "启用"}
</Button>
)}
{props.permission("qy-promise-template-edit") && (
<Button
type="link"
onClick={() => {
props.history.push(`./add?id=${record.id}`);
}}
>
编辑
</Button>
)}
</Space>
),
},
@ -96,4 +103,4 @@ function List(props) {
);
}
export default Connect([NS_COMMITMENT], true)(List);
export default Connect([NS_COMMITMENT], true)(Permission(List));

View File

@ -1,125 +1,9 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Image, Modal } from "antd";
import dayjs from "dayjs";
import { useEffect, useRef, useState } from "react";
import { useReactToPrint } from "react-to-print";
import { getFileUrl } from "zy-react-library/utils";
import { NS_COMMITMENT } from "~/enumerate/namespace";
// Info.jsx
import "./index.less";
import Info from "../../../Supervise/components/DetailModal";
const Info = (props) => {
const [form, setForm] = useState({});
const getData = async () => {
if (props.id) {
const { data } = await props[props.modalUrl]({ id: props.id });
setForm(data);
}
};
useEffect(() => {
props.id && getData();
}, []);
const contentRef = useRef(null);
const handlePrint = useReactToPrint({
contentRef,
pageStyle: `@page {
margin: 0mm;
}
@media print {
body {
margin: 10px;
padding: 10px;
}
}
`,
documentTitle: "",
});
const DetailModal = (props) => {
return (
<>
<Modal
title={form.promiseType === 0 ? "安全生产承诺书" : "安全生产责任状"}
open
onCancel={props.onCancel}
okText="打印"
onOk={handlePrint}
width={800}
>
<div ref={contentRef} className="dialogContent">
<div className="cover print_use">
<h1>{form.promiseType === 0 ? "安全生产承诺书" : "安全生产责任状"}</h1>
<div>
<div> </div>
<div>
{form.createTime ? dayjs(form.createTime).format("YYYY年") : ""}
</div>
</div>
</div>
<h1 className="title">{form.promiseType === 0 ? "安全生产承诺书" : "安全生产责任状"}</h1>
{form.promiseType === 0 && (
<div>
{`${form.userName}` || ""}
</div>
)}
<div className="text">{form.promiseText}</div>
<div className="collateral">
{form.templateDetails?.map((item, index) => (
<div key={index} className="item">{item.collateral}</div>
))}
</div>
<div className="text">
{form.promiseType === 0
? (
<div>若违反上述承诺和未履行安全生产职责或发生责任事故的接受政府或公司事故调查组做出的处罚决定</div>
)
: (
<div>若未履行安全生产职责或发生生产安全事故的接受公司或政府事故调查组做出的处罚</div>
)}
</div>
<div style={{ alignItems: form.filepath ? "flex-end" : "flex-start" }}>
{form.promiseType === 1 && (
<div className="hairdresser">
{!form.filepath
? (
<div className="promiser">
发状人
{form.userName}
</div>
)
: (
<div className="promiser">
<span style={{ marginRight: form.filepath ? "0px" : "105px" }}>
发状人
<Image src={getFileUrl() + form.filepath} alt="sign" width={100} height={100} />
</span>
</div>
)}
</div>
)}
<div className="footer">
<div className="respondent">
<div className="promiser">
<span style={{ marginRight: form.filepath ? "0px" : "105px" }}>
{form.promiseType === 0 ? "承诺人(本人签字)" : "受状人"}
</span>
</div>
</div>
</div>
</div>
</div>
</Modal>
</>
<Info {...props} />
);
};
export default Connect([NS_COMMITMENT], true)(Info);
export default DetailModal;

View File

@ -1,72 +0,0 @@
.dialogContent {
padding: 50px;
font-size: 16px;
.cover {
height: 841pt;
text-align: center;
position: relative;
display: none;
h1 {
padding-top: 300px;
}
> div {
position: absolute;
bottom: 100px;
left: 50%;
transform: translateX(-50%);
}
}
@media print {
.cover {
display: block;
}
}
.title {
text-align: center;
}
.text {
text-indent: 35px;
line-height: 26px;
letter-spacing: 2px;
text-align: justify;
}
.collateral {
text-indent: 35px;
line-height: 26px;
letter-spacing: 2px;
text-align: justify;
}
.footer {
text-indent: 35px;
margin-top: 30px;
display: flex;
justify-content: space-between;
}
.respondent,
.hairdresser {
.promiser {
display: flex;
align-items: flex-end;
img {
margin-left: 30px;
width: 200px;
height: 100px;
}
}
.time {
margin-top: 30px;
margin-left: 65px;
}
}
}

View File

@ -1,8 +1,9 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Col, Divider, Form, Input, message, Modal, Row, Select, Space } from "antd";
import { Button, Form, message, Modal, Space } from "antd";
import dayjs from "dayjs";
import { cloneDeep } from "lodash-es";
import { useEffect, useState } from "react";
import Editor from "zy-react-library/components/Editor";
import FormBuilder from "zy-react-library/components/FormBuilder";
import HeaderBack from "zy-react-library/components/HeaderBack";
import Search from "zy-react-library/components/Search";
@ -13,32 +14,34 @@ import Table from "zy-react-library/components/Table";
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { getLabelName, validatorEndTime } from "zy-react-library/utils";
import { PROMISE_TYPE_ENUM } from "~/enumerate/constant";
import { NS_COMMITMENT } from "~/enumerate/namespace";
const typeList = [{ name: "承诺书", bianma: 0 }, { name: "责任书", bianma: 1 }];
const getTypeName = (value) => {
return typeList.find(item => item.bianma === value)?.name || "";
};
function Add(props) {
const query = useGetUrlQuery();
const [form] = Form.useForm();
const promisePersons = Form.useWatch("promisePersons", form);
const promiseType = Form.useWatch("promiseType", form);
const [basicInfo, setBasicInfo] = useState([]);
const promiseTermStart = Form.useWatch("promiseTermStart", form);
const passivePostId = Form.useWatch("passivePostId", form);
const passiveDepartmentId = Form.useWatch("passiveDepartmentId", form);
const [postList, setPostList] = useState([]);
const [postList1, setPostList1] = useState([]);
const [choiceTemplateModalOpen, setchoiceTemplateModalOpen] = useState(false);
const getPostList = async (departmentId, corpId, index) => {
// 请求后台岗位接口
const getPostList = async (departmentId, index) => {
const { data } = await props["jobInfo"]({ departmentId, corpFlag: 1 });
// 将岗位列表写入 map
setBasicInfo((prevBasicInfo) => {
const newBasicInfo = cloneDeep(prevBasicInfo);
newBasicInfo[index] = data;
return newBasicInfo;
setPostList((prevPostList) => {
const newPostList = cloneDeep(prevPostList);
newPostList[index] = data;
return newPostList;
});
};
const getPostList1 = async (departmentId) => {
const { data } = await props["jobInfo"]({ departmentId, corpFlag: 1 });
setPostList1(data);
};
const getData = async () => {
if (query.id) {
const { data } = await props["busPromiseView"]({ id: query.id });
@ -50,7 +53,7 @@ function Add(props) {
const values = {
...data,
promisePersons: promisePeopleBack,
promiseTypeName: getTypeName(data.promiseType),
promiseTypeName: getLabelName({ list: PROMISE_TYPE_ENUM, status: data.promiseType }),
passiveDepartmentId: data.promisePeople.departmentId,
passiveDepartmentName: data.promisePeople.departmentName,
passivePostId: data.promisePeople.postId,
@ -62,7 +65,7 @@ function Add(props) {
...values,
});
for (let i = 0; i < values.promisePersons.length; i++) {
await getPostList(values.promisePersons[i].departmentId, values.promisePersons[i].corpId, i);
await getPostList(values.promisePersons[i].departmentId, i);
}
}
};
@ -93,6 +96,7 @@ function Add(props) {
id: query.id,
promiseId: query.promiseId,
promisePeoples: promiseAll,
peopleNumInvolved: values.promisePersons.length,
});
if (success) {
message.success("操作成功");
@ -109,14 +113,13 @@ function Add(props) {
values={{
promisePeoples: [{}], // 被承诺人
promisePersons: [{}], // 承诺人
promiseDetails: [{}], // 模板
}}
onFinish={onSubmit}
options={[
{ name: "promiseName", label: "承诺名称" },
{ name: "promiseName", label: "安全承诺名称" },
{
name: "level",
label: "承诺级别",
label: "安全承诺级别",
render: (
<DictionarySelect
dictValue="PROMISE_LEVEL"
@ -124,27 +127,16 @@ function Add(props) {
/>
),
},
{ name: "levelName", label: "承诺级别名称", onlyForLabel: true },
{ name: "levelName", label: "安全承诺级别名称", onlyForLabel: true },
{ name: "promiseTermStart", label: "适用期限开始", render: FORM_ITEM_RENDER_ENUM.DATE },
{
name: "promiseTermEnd",
label: "适用期限结束",
render: FORM_ITEM_RENDER_ENUM.DATE,
rules: [{
rules: [validatorEndTime(promiseTermStart), {
validator: (_, value) => {
const timeStart = form.getFieldValue("promiseTermStart");
if (value && timeStart && value < timeStart) {
return Promise.reject("结束时间不能早于开始时间");
}
else {
return Promise.resolve();
}
},
}, {
validator: (_, value) => {
const timeStart = form.getFieldValue("promiseTermStart");
if (value && timeStart) {
const startYear = dayjs(timeStart).year();
if (value && promiseTermStart) {
const startYear = dayjs(promiseTermStart).year();
const endYear = dayjs(value).year();
if (startYear !== endYear) {
@ -155,321 +147,187 @@ function Add(props) {
},
}],
},
{ key: "divider1", label: "承诺内容", render: FORM_ITEM_RENDER_ENUM.DIVIDER },
{
key: "promiseDetails",
span: 24,
key: "commitmentContentButton",
customizeRender: true,
span: 24,
render: (
<>
<Divider orientation="left">承诺书内容</Divider>
<div style={{ textAlign: "right", marginBottom: "20px" }}>
<Button
type="primary"
onClick={() => {
setchoiceTemplateModalOpen(true);
}}
>
选择模板
</Button>
</div>
<div>
<Row>
<Col span={24}>
<Form.Item
label="类型"
rules={
[
{ required: true, message: "请输入类型" },
]
}
name="promiseTypeName"
labelCol={{ span: 2 }}
wrapperCol={{ span: 22 }}
>
<Input disabled />
</Form.Item>
<Form.Item label="类型" noStyle name="promiseType">
<input type="hidden" />
</Form.Item>
</Col>
<Col span={24}>
<Form.Item
label="正文"
rules={
[
{ required: true, message: "请输入正文" },
]
}
name="promiseText"
labelCol={{ span: 2 }}
wrapperCol={{ span: 22 }}
>
<Input placeholder="请输入正文" />
</Form.Item>
</Col>
</Row>
<Form.List name="promiseDetails">
{(fields, { add, remove }) => (
<>
{fields.map((field, index) => (
<Row gutter={24} key={field.key}>
<Col span={24}>
<Form.Item label="副文" required labelCol={{ span: 2 }} wrapperCol={{ span: 22 }}>
<div style={{ display: "flex", gap: 10 }}>
<Form.Item
noStyle
rules={
[
{ required: true, message: "请输入副文" },
]
}
name={[field.name, "collateral"]}
>
<Input.TextArea placeholder="请输入副文" rows={4} maxLength={500} />
</Form.Item>
{
index >= 1
? <Button type="primary" danger onClick={() => remove(field.name)}>删除</Button>
: (
<Button
type="primary"
onClick={() => add({
deptId: undefined,
deptName: undefined,
userId: undefined,
userName: undefined,
type: 300,
})}
>
新增
</Button>
)
}
</div>
</Form.Item>
</Col>
</Row>
))}
</>
)}
</Form.List>
</div>
{choiceTemplateModalOpen && (
<ChoiceTemplateModal
parentForm={form}
onCancel={() => setchoiceTemplateModalOpen(false)}
data={{ id: query.id, hiddenId: query.hiddenId }}
/>
)}
</>
<div style={{ textAlign: "right", marginBottom: "20px" }}>
<Button
type="primary"
onClick={() => {
setchoiceTemplateModalOpen(true);
}}
>
选择模板
</Button>
</div>
),
},
{ name: "promiseTypeName", label: "安全承诺类型", onlyForLabel: true },
{ name: "promiseType", label: "安全承诺类型", onlyForLabel: true },
{ name: "promiseText", label: "安全承诺内容", span: 24, render: (<Editor />) },
{ key: "divider2", label: "承诺人", render: FORM_ITEM_RENDER_ENUM.DIVIDER },
{
key: "promisePersons",
name: "promisePersons",
span: 24,
customizeRender: true,
render: FORM_ITEM_RENDER_ENUM.FORM_LIST,
formListUniqueProps: {
options: (field, index) => (
[
{
name: [field.name, "departmentId"],
span: 8,
labelCol: { span: 6 },
label: `部门${index + 1}`,
render: (
<DepartmentSelectTree
onChange={async (departmentId) => {
form.setFieldValue(["promisePersons", field.name, "postId"], "");
form.setFieldValue(["promisePersons", field.name, "postName"], "");
form.setFieldValue(["promisePersons", field.name, "userName"], "");
form.setFieldValue(["promisePersons", field.name, "userId"], []);
if (!departmentId)
return;
getPostList(departmentId, index);
}}
onGetLabel={(label) => {
form.setFieldValue(["promisePersons", field.name, "departmentName"], label);
}}
/>
),
},
{ name: [field.name, "departmentName"], label: `部门${index + 1}名称`, onlyForLabel: true },
{
name: [field.name, "postId"],
span: 8,
labelCol: { span: 6 },
label: `岗位${index + 1}`,
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: postList[index] || [],
itemsField: { labelKey: "postName", valueKey: "id" },
componentProps: {
onChange: (event) => {
form.setFieldValue(["promisePersons", field.name, "postName"], getLabelName({ list: postList[index], status: event, nameKey: "postName", idKey: "id" }));
form.setFieldValue(["promisePersons", field.name, "userName"], "");
form.setFieldValue(["promisePersons", field.name, "userId"], []);
},
},
},
{ name: [field.name, "postName"], label: `岗位${index + 1}名称`, onlyForLabel: true },
{ name: [field.name, "userName"], label: `人员${index + 1}名称`, onlyForLabel: true },
{
name: [field.name, "userId"],
span: 8,
labelCol: { span: 6 },
label: `人员${index + 1}`,
render: (
<PersonnelSelect
params={{
postId: promisePersons?.[field.name]?.postId || "",
departmentId: promisePersons?.[field.name]?.departmentId || "",
}}
isNeedPostId={true}
onGetLabel={(label) => {
form.setFieldValue(["promisePersons", field.name, "userName"], label);
}}
mode="multiple"
/>
),
},
]
),
},
},
{ key: "divider3", label: "被承诺人", render: FORM_ITEM_RENDER_ENUM.DIVIDER },
{
name: "passiveDepartmentId",
label: "部门",
span: 8,
labelCol: { span: 6 },
render: (
<>
<Divider orientation="left">
{promiseType === 1 || promiseType === "责任书"
? "受状人"
: "承诺人"}
</Divider>
<DepartmentSelectTree
onChange={async (departmentId) => {
form.setFieldValue("passivePostName", "");
form.setFieldValue("passivePostId", []);
form.setFieldValue("passiveUserName", "");
form.setFieldValue("passiveUserId", "");
<Form.List name="promisePersons">
{(fields, { add, remove }) => (
<>
{fields.map((field, index) => (
<Row gutter={[24, 10]} key={field.key} style={{ marginBottom: 10 }}>
<Col span={8}>
<Form.Item
label={`部门${index + 1}`}
rules={
[
{ required: true, message: "请选择部门" },
]
}
name={[field.name, "departmentId"]}
>
<DepartmentSelectTree
onChange={async (departmentId) => {
form.setFieldValue(["promisePersons", field.name, "postId"], "");
form.setFieldValue(["promisePersons", field.name, "postName"], "");
form.setFieldValue(["promisePersons", field.name, "userName"], "");
form.setFieldValue(["promisePersons", field.name, "userId"], []);
if (!departmentId)
return;
getPostList(departmentId, promisePersons?.[field.name]?.corpId, index);
}}
onGetLabel={(label) => {
form.setFieldValue(["promisePersons", field.name, "departmentName"], label);
}}
/>
</Form.Item>
<Form.Item label="部门" noStyle name={[field.name, "departmentName"]}>
<input type="hidden" />
</Form.Item>
</Col>
<Col span={8}>
<Form.Item
label={`岗位${index + 1}`}
rules={
[
{ required: true, message: "请选择岗位" },
]
}
name={[field.name, "postId"]}
>
<Select
onChange={(value) => {
const label = basicInfo[index].find(item => item.id === value)?.postName;
form.setFieldValue(["promisePersons", field.name, "postName"], label);
form.setFieldValue(["promisePersons", field.name, "userName"], "");
form.setFieldValue(["promisePersons", field.name, "userId"], []);
}}
placeholder="请选择岗位"
showSearch
allowClear
optionFilterProp="children"
>
{(basicInfo[index] || []).map((item) => {
const value = item.id;
const label = item.postName;
return (
<Select.Option key={value} value={value}>
{label}
</Select.Option>
);
})}
</Select>
</Form.Item>
<Form.Item label="岗位" noStyle name={[field.name, "postName"]}>
<input type="hidden" />
</Form.Item>
</Col>
<Col span={6}>
<Form.Item
label={`人员${index + 1}`}
rules={
[
{ required: true, message: "请选择人员" },
]
}
name={[field.name, "userId"]}
>
<PersonnelSelect
params={{
postId: promisePersons?.[field.name]?.postId || "",
departmentId: promisePersons?.[field.name]?.departmentId || "",
}}
isNeedPostId={true}
onGetLabel={(label) => {
form.setFieldValue(["promisePersons", field.name, "userName"], label);
}}
mode={(promiseType === 1 || promiseType === "责任书") ? "tags" : "multiple"}
/>
</Form.Item>
<Form.Item label="人员" noStyle name={[field.name, "userName"]}>
<input type="hidden" />
</Form.Item>
</Col>
{
promiseType === 1 || promiseType === "责任书"
? ""
: (index >= 1
? <Button type="primary" danger onClick={() => remove(field.name)}>删除</Button>
: <Button type="primary" onClick={() => add()}>新增</Button>)
}
</Row>
))}
</>
)}
</Form.List>
</>
if (!departmentId)
return;
getPostList1(departmentId);
}}
onGetLabel={(label) => {
form.setFieldValue("passiveDepartmentName", label);
}}
/>
),
},
{ key: "passive", label: (promiseType === 1 || promiseType === "责任书") ? "发状人" : "被承诺人", render: FORM_ITEM_RENDER_ENUM.DIVIDER },
{ name: "passiveDepartmentId", label: "部门", span: 8, render: (
<DepartmentSelectTree
onChange={async (departmentId) => {
// 清空岗位和人员
form.setFieldValue("passivePostName", "");
form.setFieldValue("passivePostId", []);
form.setFieldValue("passiveUserName", "");
form.setFieldValue("passiveUserId", []);
if (!departmentId)
return;
getPostList(departmentId, "", 0);
}}
onGetLabel={(label) => {
form.setFieldValue("passiveDepartmentName", label);
}}
/>
) },
{ name: "passiveDepartmentName", label: "部门名称", onlyForLabel: true },
{ name: "passivePostId", label: "岗位", span: 8, render:
(
<>
<Select
onChange={(value) => {
const label = basicInfo[0].find(item => item.id === value)?.postName;
form.setFieldValue("passivePostName", label);
form.setFieldValue("passiveUserName", "");
form.setFieldValue("passiveUserId", []);
}}
placeholder="请选择岗位"
showSearch
allowClear
optionFilterProp="children"
>
{(basicInfo[0] || []).map((item) => {
const value = item.id;
const label = item.postName;
return (
<Select.Option key={value} value={value}>
{label}
</Select.Option>
);
})}
</Select>
</>
) },
{
name: "passivePostId",
label: "岗位",
span: 8,
labelCol: { span: 6 },
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: postList1,
itemsField: { labelKey: "postName", valueKey: "id" },
componentProps: {
onChange: (event) => {
form.setFieldValue("passivePostName", getLabelName({ list: postList1, status: event, nameKey: "postName", idKey: "id" }));
form.setFieldValue("passiveUserName", "");
form.setFieldValue("passiveUserId", "");
},
},
},
{ name: "passivePostName", label: "岗位名称", onlyForLabel: true },
{ name: "passiveUserId", label: "人员", span: 8, render: (
<PersonnelSelect
params={{
postId: form.getFieldValue("passivePostId") || "",
departmentId: form.getFieldValue("passiveDepartmentId") || "",
}}
isNeedPostId={true}
onGetLabel={(label) => {
form.setFieldValue("passiveUserName", label);
}}
onChange={(value) => {
form.setFieldValue("passiveUserId", value);
}}
// mode="multiple"
/>
) },
{
name: "passiveUserId",
label: "人员",
span: 8,
labelCol: { span: 6 },
render: (
<PersonnelSelect
params={{
postId: passivePostId,
departmentId: passiveDepartmentId,
}}
isNeedPostId={true}
onGetLabel={(label) => {
form.setFieldValue("passiveUserName", label);
}}
/>
),
},
{ name: "passiveUserName", label: "人员名称", onlyForLabel: true },
]}
/>
{choiceTemplateModalOpen && (
<ChoiceTemplateModal
onCancel={() => setchoiceTemplateModalOpen(false)}
onConfirm={(values) => {
form.setFieldValue("promiseType", values.promiseType);
form.setFieldValue("promiseTypeName", getLabelName({ list: PROMISE_TYPE_ENUM, status: values.promiseType }));
form.setFieldValue("promiseText", values.promiseText);
form.setFieldValue("promisePersons", [{}]);
form.setFieldValue("passiveDepartmentName", "");
form.setFieldValue("passiveDepartmentId", "");
form.setFieldValue("passivePostName", "");
form.setFieldValue("passivePostId", "");
form.setFieldValue("passiveUserName", "");
form.setFieldValue("passiveUserId", "");
}}
/>
)}
</div>
</div>
);
}
const ChoiceTemplateModalComponent = (props) => {
const parentForm = props.parentForm; // 使用外层表单
const [form] = Form.useForm(); // ← 只给搜索用,不影响主页面
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["busPromiseTemplateList"], {
form,
});
@ -477,28 +335,29 @@ const ChoiceTemplateModalComponent = (props) => {
return (
<Modal
open
width={800}
width={1200}
maskClosable={false}
onCancel={props.onCancel}
footer={[
<Button key="close" onClick={() => props.onCancel()}>关闭</Button>,
]}
onCancel={props.onCancel}
>
<div style={{ padding: 20 }}>
<Search
labelCol={{ span: 8 }}
form={form}
options={[
{ name: "hiddenDesc", label: "承诺书名称" },
{ name: "likePromiseName", label: "安全承诺名称" },
]}
onFinish={getData}
/>
<Table
columns={[
{ title: "承诺名称", dataIndex: "promiseName" },
{ title: "安全承诺名称", dataIndex: "promiseName" },
{
title: "类型",
title: "安全承诺类型",
dataIndex: "promiseType",
render: (_, record) => getLabelName({ list: typeList, status: record.promiseType }),
render: (_, record) => getLabelName({ list: PROMISE_TYPE_ENUM, status: record.promiseType }),
},
{
title: "操作",
@ -509,26 +368,7 @@ const ChoiceTemplateModalComponent = (props) => {
<Button
type="link"
onClick={() => {
// 更新外层 Form主页面
parentForm.setFieldValue("promiseType", record.promiseType);
parentForm.setFieldValue("promiseTypeName", getTypeName(record.promiseType));
parentForm.setFieldValue("promiseText", record.promiseText);
parentForm.setFieldValue(
"promiseDetails",
record.templateDetails?.length
? record.templateDetails
: [{}],
);
const promisePersonsList = parentForm.getFieldValue("promisePersons");
promisePersonsList.forEach((item, index) => {
parentForm.setFieldValue(["promisePersons", index], "");
});
parentForm.setFieldValue("passiveDepartmentName", "");
parentForm.setFieldValue("passiveDepartmentId", []);
parentForm.setFieldValue("passivePostName", "");
parentForm.setFieldValue("passivePostId", []);
parentForm.setFieldValue("passiveUserName", "");
parentForm.setFieldValue("passiveUserId", []);
props.onConfirm(record);
props.onCancel();
}}
>

View File

@ -29,10 +29,10 @@ function Detail(props) {
<Descriptions
bordered
column={1}
labelStyle={{ width: 200 }}
styles={{ label: { width: 200 } }}
items={[
{ label: "承诺名称", children: detail.promiseName },
{ label: "承诺级别", children: detail.levelName },
{ label: "安全承诺名称", children: detail.promiseName },
{ label: "安全承诺级别", children: detail.levelName },
{ label: "适用期限开始", children: detail.promiseTermStart },
{ label: "适用期限结束", children: detail.promiseTermEnd },
]}
@ -41,25 +41,17 @@ function Detail(props) {
<Descriptions
bordered
column={1}
labelStyle={{ width: 200 }}
styles={{ label: { width: 200 } }}
items={[
{ label: "正文", children: detail.promiseText },
...(detail.promiseDetails || []).map((item, index) => ({
label: `副文${index + 1}`,
children: item.collateral || "-",
})),
{ label: "承诺内容", children: detail.promiseText },
]}
/>
<Divider orientation="left">
{detail.promiseType === 1
? "受状人"
: "承诺人"}
</Divider>
<Divider orientation="left">{detail.promiseType === 1 ? "受状人" : "承诺人"}</Divider>
<Descriptions
bordered
column={3}
labelStyle={{ width: 200 }}
styles={{ label: { width: 200 } }}
items={[
...(detail.promisePersons || []).flatMap((item, index) => {
const base = [
@ -71,15 +63,11 @@ function Detail(props) {
}),
]}
/>
<Divider orientation="left">
{detail.promiseType === 1
? "发状人"
: "被承诺人"}
</Divider>
<Divider orientation="left">{detail.promiseType === 1 ? "发状人" : "被承诺人"}</Divider>
<Descriptions
bordered
column={3}
labelStyle={{ width: 200 }}
styles={{ label: { width: 200 } }}
items={[
{ label: "部门", children: detail.promisePeople?.departmentName || "-" },
{ label: "岗位", children: detail.promisePeople?.postName || "-" },

View File

@ -1,3 +1,4 @@
import { Permission } from "@cqsjjb/jjb-common-decorator/permission";
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, message, Modal, Space, Tooltip } from "antd";
import AddIcon from "zy-react-library/components/Icon/AddIcon";
@ -39,43 +40,49 @@ function List(props) {
return (
<div style={{ padding: 20 }}>
<Search
labelCol={{ span: 8 }}
form={form}
options={[
{ name: "likePromiseName", label: "承诺名称" },
{ name: "eqLevel", label: "承诺级别", render: (<DictionarySelect dictValue="PROMISE_LEVEL" onGetLabel={label => form.setFieldValue("levelName", label)} />) },
{ name: "likePromiseName", label: "安全承诺名称" },
{ name: "eqLevel", label: "安全承诺级别", render: (<DictionarySelect dictValue="PROMISE_LEVEL" onGetLabel={label => form.setFieldValue("levelName", label)} />) },
{ name: "dates", label: "下发时间", render: FORM_ITEM_RENDER_ENUM.DATE_RANGE },
{ name: "eqDepartments", label: "部门", render: (<DepartmentSelectTree />) },
{ name: "eqDepartments", label: "涉及部门", render: (<DepartmentSelectTree />) },
{
name: "eqSignState",
label: "签署状态",
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: [{ bianma: "0", name: "已完成" }, { bianma: "1", name: "未完成" }],
},
]}
onFinish={getData}
/>
<Table
toolBarRender={() => (
<>
<Button
type="primary"
icon={<AddIcon />}
onClick={() => {
props.history.push("./add");
}}
>
新增
</Button>
{props.permission("qy-promise-management-add") && (
<Button
type="primary"
icon={<AddIcon />}
onClick={() => {
props.history.push("./add");
}}
>
新增
</Button>
)}
</>
)}
columns={[
{ title: "承诺名称", dataIndex: "promiseName" },
{ title: "承诺级别", dataIndex: "levelName" },
{ title: "安全承诺名称", dataIndex: "promiseName" },
{ title: "安全承诺级别", dataIndex: "levelName" },
{ title: "适用期限", render: (_, record) => `${record.promiseTermStart}${record.promiseTermEnd}` },
{ title: "下发对象", dataIndex: "releasePlatform", render: (_, record) => getLabelName({ list: [[{ name: "分公司", bianma: 1 }, { name: "股份内部", bianma: 2 }]], status: record.releasePlatform }) },
{ title: "涉及部门", dataIndex: "departmentNames" },
{ title: "涉及岗位", dataIndex: "postNames" },
{ title: "承诺人数/涉及人数", dataIndex: "signedCount" },
{ title: "承诺人数/涉及人数", dataIndex: "signedCount", render: (_, record) => `已完成${record.signedCount}/${record.peopleNumInvolved}` },
{ title: "下发时间", dataIndex: "updateTime" },
{ title: "状态", render: (_, record) => getLabelName({ list: [{ name: "启用", bianma: "0" }, { name: "禁用", bianma: "1" }], status: record.state }) },
{ title: "状态", render: (_, record) => getLabelName({ list: [{ name: "已下发", bianma: "0" }, { name: "暂存", bianma: "1" }], status: record.state }) },
{
title: "操作",
width: 200,
width: 220,
fixed: "right",
render: (_, record) => (
<Space>
@ -87,28 +94,32 @@ function List(props) {
>
查看
</Button>
<Tooltip title="下发后不可编辑" placement="top">
{props.permission("qy-promise-management-issue") && (
<Tooltip title="下发后不可编辑" placement="top">
<Button
type="link"
onClick={() => handleRelease(record.id, record.state)}
disabled={record.state === 0}
>
下发
</Button>
</Tooltip>
)}
{props.permission("qy-promise-management-edit") && (
<Button
type="link"
onClick={() => handleRelease(record.id, record.state)}
onClick={() => {
props.history.push(`./add?id=${record.id}`);
}}
disabled={record.state === 0}
>
下发
编辑
</Button>
</Tooltip>
)}
<Button
type="link"
onClick={() => {
props.history.push(`./add?id=${record.id}`);
}}
disabled={record.state === 0}
>
编辑
</Button>
<Button
type="link"
onClick={() => {
props.history.push(`./Release?id=${record.promiseId}`);
props.history.push(`./Release?id=${record.id}&promiseId=${record.promiseId}`);
}}
disabled={record.state !== 0}
>
@ -125,4 +136,4 @@ function List(props) {
);
}
export default Connect([NS_COMMITMENT], true)(List);
export default Connect([NS_COMMITMENT], true)(Permission(List));

View File

@ -14,16 +14,30 @@ function List(props) {
const [form] = Form.useForm();
const { tableProps } = useTable(props["busPromisePeople"], {
form,
params: { eqPromiseId: query.id },
params: { eqPromiseId: query.promiseId },
});
const [busPromiseTemplateModalOpen, setBusPromiseTemplateModalOpen] = useState(false);
const [id, setId] = useState("");
const [modalUrl, setModalUrl] = useState("");
return (
<div>
<HeaderBack title="查看" />
<HeaderBack title="签署详情" />
<div style={{ padding: 20 }}>
<Table
toolBarRender={() => (
<Space>
<Button
type="primary"
onClick={() => {
setBusPromiseTemplateModalOpen(true);
setId(query.id);
setModalUrl("busPromisePeopleAllSign");
}}
>
签署汇总
</Button>
</Space>
)}
columns={[
{ title: "部门", dataIndex: "departmentName" },
{ title: "岗位", dataIndex: "postName" },

View File

@ -1,11 +1,13 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Col, Form, Input, message, Row } from "antd";
import { Form, message } from "antd";
import { useEffect } from "react";
import Editor from "zy-react-library/components/Editor";
import FormBuilder from "zy-react-library/components/FormBuilder";
import HeaderBack from "zy-react-library/components/HeaderBack";
import DictionarySelect from "zy-react-library/components/Select/Dictionary";
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
import { PROMISE_TYPE_ENUM } from "~/enumerate/constant";
import { NS_COMMITMENT } from "~/enumerate/namespace";
function Add(props) {
@ -43,54 +45,13 @@ function Add(props) {
<div style={{ paddingBottom: 10 }}>
<FormBuilder
form={form}
values={{
templateDetails: [{}],
}}
onFinish={onSubmit}
options={[
{ name: "promiseName", label: "承诺书名称", span: 24 },
{ name: "promiseType", label: "承诺书类型", render: FORM_ITEM_RENDER_ENUM.SELECT, items: [{ name: "承诺书", bianma: 0 }, { name: "责任书", bianma: 1 }] },
{ name: "level", label: "承诺书级别", render: (<DictionarySelect dictValue="PROMISE_LEVEL" onGetLabel={label => form.setFieldValue("levelName", label)} />) },
{ name: "levelName", label: "承诺书级别", onlyForLabel: true },
{ name: "promiseText", label: "正文", span: 24, render: FORM_ITEM_RENDER_ENUM.TEXTAREA },
{ key: "templateDetails", span: 24, customizeRender: true, render: (
<>
<Form.List name="templateDetails">
{(fields, { add, remove }) => (
<>
{fields.map((field, index) => (
<Row gutter={24} key={field.key}>
<Col span={24}>
<Form.Item label="副文" required labelCol={{ span: 2 }} wrapperCol={{ span: 22 }}>
<div style={{ display: "flex", gap: 10 }}>
<Form.Item
noStyle
rules={
[
{ required: true, message: "请输入副文" },
]
}
name={[field.name, "collateral"]}
>
<Input.TextArea placeholder="请输入副文" rows={4} maxLength={500} />
</Form.Item>
{
index >= 1
? <Button type="primary" danger onClick={() => remove(field.name)}>删除</Button>
: <Button type="primary" onClick={() => add({ deptId: undefined, deptName: undefined, userId: undefined, userName: undefined, type: 300 })}>新增</Button>
}
</div>
</Form.Item>
</Col>
</Row>
))}
</>
)}
</Form.List>
</>
) },
{ name: "promiseName", label: "安全承诺模板名称", span: 24 },
{ name: "promiseType", label: "安全承诺类型", render: FORM_ITEM_RENDER_ENUM.SELECT, items: PROMISE_TYPE_ENUM },
{ name: "level", label: "安全承诺级别", render: (<DictionarySelect dictValue="PROMISE_LEVEL" onGetLabel={label => form.setFieldValue("levelName", label)} />) },
{ name: "levelName", label: "安全承诺级别名称", onlyForLabel: true },
{ name: "promiseText", label: "承诺内容", span: 24, render: (<Editor />) },
]}
/>
</div>

View File

@ -1,3 +1,4 @@
import { Permission } from "@cqsjjb/jjb-common-decorator/permission";
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, message, Modal, Space } from "antd";
import { useState } from "react";
@ -7,11 +8,10 @@ import Table from "zy-react-library/components/Table";
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { PROMISE_TYPE_ENUM } from "~/enumerate/constant";
import { NS_COMMITMENT } from "~/enumerate/namespace";
import DetailModal from "~/pages/Container/Supervise/Components/DetailModal";
const typeList = [{ name: "承诺书", bianma: 0 }, { name: "责任书", bianma: 1 }];
function List(props) {
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["busPromiseTemplateList"], {
@ -53,30 +53,32 @@ function List(props) {
labelCol={{ span: 8 }}
form={form}
options={[
{ name: "hiddenDesc", label: "模板名称" },
{ name: "promiseType", label: "承诺类型", render: FORM_ITEM_RENDER_ENUM.SELECT, items: typeList },
{ name: "likePromiseName", label: "安全承诺模板名称" },
{ name: "promiseType", label: "安全承诺类型", render: FORM_ITEM_RENDER_ENUM.SELECT, items: PROMISE_TYPE_ENUM },
]}
onFinish={getData}
/>
<Table
toolBarRender={() => (
<>
<Button
type="primary"
icon={<AddIcon />}
onClick={() => {
props.history.push("./add");
}}
>
新增
</Button>
{props.permission("jg-promise-template-add") && (
<Button
type="primary"
icon={<AddIcon />}
onClick={() => {
props.history.push("./add");
}}
>
新增
</Button>
)}
</>
)}
columns={[
{ title: "公司名称", dataIndex: "corpName" },
{ title: "模板名称", dataIndex: "promiseName" },
{ title: "承诺级别", dataIndex: "levelName" },
{ title: "类型", dataIndex: "promiseType", render: (_, record) => getLabelName({ list: typeList, status: record.promiseType }) },
{ title: "安全承诺模板名称", dataIndex: "promiseName" },
{ title: "安全承诺级别", dataIndex: "levelName" },
{ title: "安全承诺类型", dataIndex: "promiseType", render: (_, record) => getLabelName({ list: PROMISE_TYPE_ENUM, status: record.promiseType }) },
{ title: "添加时间", dataIndex: "createTime" },
{ title: "状态", render: (_, record) => getLabelName({ list: [{ name: "启用", bianma: "0" }, { name: "禁用", bianma: "1" }], status: record.state }) },
{
@ -95,19 +97,22 @@ function List(props) {
>
查看
</Button>
<Button type="link" onClick={() => updatate(record.id, record.state)}>
{record.state === 0 ? "禁用" : "启用"}
</Button>
<Button
type="link"
onClick={() => {
props.history.push(`./add?id=${record.id}`);
}}
>
编辑
</Button>
<Button type="link" danger onClick={() => onDelete(record.id)}>删除</Button>
{props.permission("jg-promise-template-disable") && (
<Button type="link" onClick={() => updatate(record.id, record.state)}>
{record.state === 0 ? "禁用" : "启用"}
</Button>
)}
{props.permission("jg-promise-template-edit") && (
<Button
type="link"
onClick={() => {
props.history.push(`./add?id=${record.id}`);
}}
>
编辑
</Button>
)}
{props.permission("jg-promise-template-deletes") && <Button type="link" danger onClick={() => onDelete(record.id)}>删除</Button>}
</Space>
),
},
@ -119,4 +124,4 @@ function List(props) {
);
}
export default Connect([NS_COMMITMENT], true)(List);
export default Connect([NS_COMMITMENT], true)(Permission(List));

View File

@ -1,8 +1,9 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Col, Divider, Form, Input, message, Modal, Row, Select, Space } from "antd";
import { Button, Form, message, Modal, Space } from "antd";
import dayjs from "dayjs";
import { cloneDeep } from "lodash-es";
import { useEffect, useState } from "react";
import Editor from "zy-react-library/components/Editor";
import FormBuilder from "zy-react-library/components/FormBuilder";
import HeaderBack from "zy-react-library/components/HeaderBack";
import Search from "zy-react-library/components/Search";
@ -13,14 +14,10 @@ import Table from "zy-react-library/components/Table";
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { getLabelName, validatorEndTime } from "zy-react-library/utils";
import { PROMISE_TYPE_ENUM, RELEASE_PLATFORM_ENUM } from "~/enumerate/constant";
import { NS_COMMITMENT } from "~/enumerate/namespace";
const typeList = [{ name: "承诺书", bianma: 0 }, { name: "责任书", bianma: 1 }];
const getTypeName = (value) => {
return typeList.find(item => item.bianma === value)?.name || "";
};
function Add(props) {
const query = useGetUrlQuery();
const [form] = Form.useForm();
@ -28,25 +25,28 @@ function Add(props) {
const promisePersons = Form.useWatch("promisePersons", form);
const promiseType = Form.useWatch("promiseType", form);
const releasePlatform = Form.useWatch("releasePlatform", form);
const [dorpInfo, setDorpInfo] = useState("");
const [basicInfo, setBasicInfo] = useState([]);
const promiseTermStart = Form.useWatch("promiseTermStart", form);
const [corpInfoList, setCorpInfoList] = useState([]);
const [postList, setPostList] = useState([]);
const [postList1, setPostList1] = useState([]);
const [choiceTemplateModalOpen, setchoiceTemplateModalOpen] = useState(false);
const [promisePersonsItem, setPromisePersonsItem] = useState(true);
const [formWidth, setFormWidth] = useState(24);
const getPostList = async (departmentId, corpId, index) => {
// 请求后台岗位接口
const { data } = await props["jobInfo"]({ departmentId, corpinfoId: corpId, corpFlag: 1 });
// 将岗位列表写入 map
setBasicInfo((prevBasicInfo) => {
const newBasicInfo = cloneDeep(prevBasicInfo);
newBasicInfo[index] = data;
return newBasicInfo;
setPostList((prevPostList) => {
const newPostList = cloneDeep(prevPostList);
newPostList[index] = data;
return newPostList;
});
};
const getPostList1 = async (departmentId, corpId) => {
const { data } = await props["jobInfo"]({ departmentId, corpinfoId: corpId, corpFlag: 1 });
setPostList1(data);
};
const getData = async () => {
setDorpInfo(await props["corpInfo"]({ enterpriseType: 2, pageSize: 1000, pageIndex: 1 }));
const { data: corpInfoList } = await props["corpInfo"]({ enterpriseType: 2, pageSize: 1000, pageIndex: 1 });
setCorpInfoList(corpInfoList);
if (query.id) {
const { data } = await props["busPromiseView"]({ id: query.id });
const promisePeopleBack = data.promisePeopleBack.map(item => ({
@ -57,17 +57,18 @@ function Add(props) {
const values = {
...data,
promisePeoples: [data.promisePeople],
promiseTypeName: getTypeName(data.promiseType),
promiseTypeName: getLabelName({ list: PROMISE_TYPE_ENUM, status: data.promiseType }),
promisePersons: promisePeopleBack,
};
setFormWidth(values.releasePlatform === 1 ? 12 : 24);
setPromisePersonsItem(values.releasePlatform === 1);
form.setFieldsValue({
...values,
});
for (let i = 0; i < values.promisePersons.length; i++) {
await getPostList(values.promisePersons[i].departmentId, values.promisePersons[i].corpId, i);
}
for (let i = 0; i < values.promisePeoples.length; i++) {
await getPostList1(values.promisePeoples[i].departmentId, values.promisePeoples[i].corpId);
}
}
};
useEffect(() => {
@ -84,6 +85,7 @@ function Add(props) {
userName: item.userName.join(","),
userId: item.userId.join(","),
isPromisePeople: 0,
peopleNumInvolved: values.promisePersons.length,
}));
const promiseAll = [...peoples, ...persons];
@ -108,7 +110,6 @@ function Add(props) {
values={{
promisePeoples: [{}], // 被承诺人
promisePersons: [{}], // 承诺人
promiseDetails: [{}], // 模板
}}
onFinish={onSubmit}
options={[
@ -116,57 +117,38 @@ function Add(props) {
{
name: "releasePlatform",
label: "下发对象",
span: formWidth,
span: releasePlatform === "1" ? 12 : 24,
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: [{ name: "分公司", bianma: 1 }, { name: "股份内部", bianma: 2 }],
items: RELEASE_PLATFORM_ENUM,
componentProps: {
onChange: (value) => {
setPromisePersonsItem(value === 1);
setFormWidth(value === 1 ? 12 : 24);
const promisePersonsList = form.getFieldValue("promisePersons");
promisePersonsList.forEach((item, index) => {
form.setFieldValue(["promisePersons", index], "");
form.setFieldValue("level", undefined);
form.setFieldValue("levelName", "");
});
onChange: () => {
form.setFieldValue("promisePersons", [{}]);
form.setFieldValue("levelName", "");
},
},
},
...(releasePlatform === 1
? [
{
name: "level",
label: "承诺书级别",
render: (
<DictionarySelect
dictValue="PROMISE_LEVEL"
onGetLabel={label => form.setFieldValue("levelName", label)}
/>
),
},
{ name: "levelName", label: "承诺书级别名称", onlyForLabel: true },
]
: []),
{
name: "level",
label: "承诺书级别",
dependencies: ["releasePlatform"],
hidden: formValues => !(formValues.releasePlatform === "1"),
render: (
<DictionarySelect
dictValue="PROMISE_LEVEL"
onGetLabel={label => form.setFieldValue("levelName", label)}
/>
),
},
{ name: "levelName", label: "承诺书级别名称", onlyForLabel: true },
{ name: "promiseTermStart", label: "适用期限开始", render: FORM_ITEM_RENDER_ENUM.DATE },
{
name: "promiseTermEnd",
label: "适用期限结束",
render: FORM_ITEM_RENDER_ENUM.DATE,
rules: [{
rules: [validatorEndTime(promiseTermStart), {
validator: (_, value) => {
const timeStart = form.getFieldValue("promiseTermStart");
if (value && timeStart && value < timeStart) {
return Promise.reject("结束时间不能早于开始时间");
}
else {
return Promise.resolve();
}
},
}, {
validator: (_, value) => {
const timeStart = form.getFieldValue("promiseTermStart");
if (value && timeStart) {
const startYear = dayjs(timeStart).year();
if (value && promiseTermStart) {
const startYear = dayjs(promiseTermStart).year();
const endYear = dayjs(value).year();
if (startYear !== endYear) {
@ -177,452 +159,264 @@ function Add(props) {
},
}],
},
{ key: "divider1", label: "承诺内容", render: FORM_ITEM_RENDER_ENUM.DIVIDER },
{
key: "promiseDetails",
span: 24,
key: "commitmentContentButton",
customizeRender: true,
span: 24,
render: (
<>
<Divider orientation="left">承诺书内容</Divider>
<div style={{ textAlign: "right", marginBottom: "20px" }}>
<Button
type="primary"
onClick={() => {
setchoiceTemplateModalOpen(true);
}}
>
选择模板
</Button>
</div>
<div>
<Row>
<Col span={24}>
<Form.Item
label="类型"
rules={
[
{ required: true, message: "请输入类型" },
]
}
name="promiseTypeName"
labelCol={{ span: 2 }}
wrapperCol={{ span: 22 }}
>
<Input disabled />
</Form.Item>
<Form.Item label="类型" noStyle name="promiseType">
<input type="hidden" />
</Form.Item>
</Col>
<Col span={24}>
<Form.Item
label="正文"
rules={
[
{ required: true, message: "请输入正文" },
]
}
name="promiseText"
labelCol={{ span: 2 }}
wrapperCol={{ span: 22 }}
>
<Input placeholder="请输入正文" />
</Form.Item>
</Col>
</Row>
<Form.List name="promiseDetails">
{(fields, { add, remove }) => (
<>
{fields.map((field, index) => (
<Row gutter={24} key={field.key}>
<Col span={24}>
<Form.Item label="副文" required labelCol={{ span: 2 }} wrapperCol={{ span: 22 }}>
<div style={{ display: "flex", gap: 10 }}>
<Form.Item
noStyle
rules={
[
{ required: true, message: "请输入副文" },
]
}
name={[field.name, "collateral"]}
>
<Input.TextArea placeholder="请输入副文" rows={4} maxLength={500} />
</Form.Item>
{
index >= 1
? <Button type="primary" danger onClick={() => remove(field.name)}>删除</Button>
: (
<Button
type="primary"
onClick={() => add({
deptId: undefined,
deptName: undefined,
userId: undefined,
userName: undefined,
type: 300,
})}
>
新增
</Button>
)
}
</div>
</Form.Item>
</Col>
</Row>
))}
</>
)}
</Form.List>
</div>
{choiceTemplateModalOpen && (
<ChoiceTemplateModal
parentForm={form}
onCancel={() => setchoiceTemplateModalOpen(false)}
data={{ id: query.id, hiddenId: query.hiddenId }}
/>
)}
</>
<div style={{ textAlign: "right", marginBottom: "20px" }}>
<Button
type="primary"
onClick={() => {
setchoiceTemplateModalOpen(true);
}}
>
选择模板
</Button>
</div>
),
},
{ name: "promiseTypeName", label: "安全承诺类型", span: 24, componentProps: { disabled: true } },
{ name: "promiseType", label: "安全承诺类型", onlyForLabel: true },
{ name: "promiseText", label: "安全承诺内容", span: 24, render: (<Editor />) },
{ key: "divider2", label: promiseType === 1 ? "受状人" : "承诺人", render: FORM_ITEM_RENDER_ENUM.DIVIDER },
{
key: "promisePersons",
name: "promisePersons",
span: 24,
customizeRender: true,
render: (
<>
<Divider orientation="left">
{promiseType === 1 || promiseType === "责任书"
? "受状人"
: "承诺人"}
</Divider>
<Form.List name="promisePersons">
{(fields, { add, remove }) => (
<>
{fields.map((field, index) => (
<Row gutter={[24, 10]} key={field.key} style={{ marginBottom: 10 }}>
{promisePersonsItem && (
<Col span={12}>
<Form.Item
label={`签订单位${index + 1}`}
rules={
[
{ required: true, message: "请选择签订单位" },
]
}
name={[field.name, "corpId"]}
>
<Select
onChange={(value) => {
const label = dorpInfo.data.find(item => item.id === value)?.corpName;
form.setFieldValue(["promisePersons", field.name, "corpName"], label);
form.setFieldValue(["promisePersons", field.name, "departmentId"], "");
form.setFieldValue(["promisePersons", field.name, "departmentName"], "");
form.setFieldValue(["promisePersons", field.name, "postId"], "");
form.setFieldValue(["promisePersons", field.name, "postName"], "");
form.setFieldValue(["promisePersons", field.name, "userName"], "");
form.setFieldValue(["promisePersons", field.name, "userId"], []);
}}
placeholder="请选择签订单位"
showSearch
allowClear
optionFilterProp="children"
>
{(dorpInfo.data || []).map((item) => {
const value = item.id;
const label = item.corpName;
return (
<Select.Option key={value} value={value}>
{label}
</Select.Option>
);
})}
</Select>
</Form.Item>
<Form.Item label="签订单位名称" noStyle name={[field.name, "corpName"]}>
<input type="hidden" />
</Form.Item>
</Col>
)}
<Col span={releasePlatform === 2 ? 22 : 10}>
<Form.Item
labelCol={releasePlatform === 2 ? { span: 2 } : undefined}
wrapperCol={{ span: 22 }}
label={`部门${index + 1}`}
rules={
[
{ required: true, message: "请选择部门" },
]
}
name={[field.name, "departmentId"]}
>
<DepartmentSelectTree
isNeedCorpInfoId={promisePersonsItem && true}
params={{ eqCorpinfoId: promisePersons?.[field.name]?.corpId || "" }}
onChange={async (departmentId) => {
form.setFieldValue(["promisePersons", field.name, "postId"], "");
form.setFieldValue(["promisePersons", field.name, "postName"], "");
form.setFieldValue(["promisePersons", field.name, "userName"], "");
form.setFieldValue(["promisePersons", field.name, "userId"], []);
if (!departmentId)
return;
getPostList(departmentId, promisePersons?.[field.name]?.corpId, index);
}}
onGetLabel={(label) => {
form.setFieldValue(["promisePersons", field.name, "departmentName"], label);
}}
/>
</Form.Item>
<Form.Item label="部门" noStyle name={[field.name, "departmentName"]}>
<input type="hidden" />
</Form.Item>
</Col>
{
promiseType === 1 || promiseType === "责任书"
? ""
: (index >= 1
? <Button type="primary" danger onClick={() => remove(field.name)}>删除</Button>
: <Button type="primary" onClick={() => add()}>新增</Button>)
}
<Col span={12}>
<Form.Item
label={`岗位${index + 1}`}
rules={
[
{ required: true, message: "请选择岗位" },
]
}
name={[field.name, "postId"]}
>
<Select
onChange={(value) => {
const label = basicInfo[index].find(item => item.id === value)?.postName;
form.setFieldValue(["promisePersons", field.name, "postName"], label);
form.setFieldValue(["promisePersons", field.name, "userName"], "");
form.setFieldValue(["promisePersons", field.name, "userId"], []);
}}
placeholder="请选择岗位"
showSearch
allowClear
optionFilterProp="children"
>
{(basicInfo[index] || []).map((item) => {
const value = item.id;
const label = item.postName;
return (
<Select.Option key={value} value={value}>
{label}
</Select.Option>
);
})}
</Select>
</Form.Item>
<Form.Item label="岗位" noStyle name={[field.name, "postName"]}>
<input type="hidden" />
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
label={`人员${index + 1}`}
rules={
[
{ required: true, message: "请选择人员" },
]
}
name={[field.name, "userId"]}
>
<PersonnelSelect
params={{
postId: promisePersons?.[field.name]?.postId || "",
departmentId: promisePersons?.[field.name]?.departmentId || "",
}}
isNeedPostId={true}
onGetLabel={(label) => {
form.setFieldValue(["promisePersons", field.name, "userName"], label);
}}
mode={(promiseType === 1 || promiseType === "责任书") ? "tags" : "multiple"}
/>
</Form.Item>
<Form.Item label="人员" noStyle name={[field.name, "userName"]}>
<input type="hidden" />
</Form.Item>
</Col>
</Row>
))}
</>
)}
</Form.List>
</>
),
render: FORM_ITEM_RENDER_ENUM.FORM_LIST,
formListUniqueProps: {
showAddButton: !(promiseType === 1),
showRemoveButton: !(promiseType === 1),
options: (field, index) => (
[
...(!releasePlatform || releasePlatform === "1"
? [
{
name: [field.name, "corpId"],
label: `签订单位${index + 1}`,
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: corpInfoList,
itemsField: { labelKey: "corpName", valueKey: "id" },
componentProps: {
onChange: (event) => {
form.setFieldValue(["promisePersons", field.name, "corpName"], getLabelName({
list: corpInfoList,
status: event,
nameKey: "corpName",
idKey: "id",
}));
form.setFieldValue(["promisePersons", field.name, "departmentId"], "");
form.setFieldValue(["promisePersons", field.name, "departmentName"], "");
form.setFieldValue(["promisePersons", field.name, "postId"], "");
form.setFieldValue(["promisePersons", field.name, "postName"], "");
form.setFieldValue(["promisePersons", field.name, "userName"], "");
form.setFieldValue(["promisePersons", field.name, "userId"], promiseType === 1 ? "" : []);
},
},
},
{ name: [field.name, "corpName"], label: `签订单位${index + 1}名称`, onlyForLabel: true },
]
: []),
{
name: [field.name, "departmentId"],
label: `部门${index + 1}`,
span: releasePlatform === "2" ? 8 : 12,
labelCol: { span: releasePlatform === "2" ? 6 : 4 },
render: (
<DepartmentSelectTree
isNeedCorpInfoId={!releasePlatform || releasePlatform === "1"}
params={{ eqCorpinfoId: promisePersons?.[field.name]?.corpId || "" }}
onChange={(departmentId) => {
form.setFieldValue(["promisePersons", field.name, "postId"], "");
form.setFieldValue(["promisePersons", field.name, "postName"], "");
form.setFieldValue(["promisePersons", field.name, "userName"], "");
form.setFieldValue(["promisePersons", field.name, "userId"], promiseType === 1 ? "" : []);
if (!departmentId)
return;
getPostList(departmentId, promisePersons?.[field.name]?.corpId, index);
}}
onGetLabel={(label) => {
form.setFieldValue(["promisePersons", field.name, "departmentName"], label);
}}
/>
),
},
{ name: [field.name, "departmentName"], label: `部门${index + 1}名称`, onlyForLabel: true },
{
name: [field.name, "postId"],
label: `岗位${index + 1}`,
span: releasePlatform === "2" ? 8 : 12,
labelCol: { span: releasePlatform === "2" ? 6 : 4 },
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: postList[index] || [],
itemsField: { labelKey: "postName", valueKey: "id" },
componentProps: {
onChange: (event) => {
form.setFieldValue(["promisePersons", field.name, "postName"], getLabelName({
list: postList[index],
status: event,
nameKey: "postName",
idKey: "id",
}));
form.setFieldValue(["promisePersons", field.name, "userName"], "");
form.setFieldValue(["promisePersons", field.name, "userId"], promiseType === 1 ? "" : []);
},
},
},
{ name: [field.name, "postName"], label: `岗位${index + 1}名称`, onlyForLabel: true },
{ name: [field.name, "userName"], label: `人员${index + 1}名称`, onlyForLabel: true },
{
name: [field.name, "userId"],
label: `人员${index + 1}`,
span: releasePlatform === "2" ? 8 : 12,
labelCol: { span: releasePlatform === "2" ? 6 : 4 },
render: (
<PersonnelSelect
params={{
postId: promisePersons?.[field.name]?.postId || "",
departmentId: promisePersons?.[field.name]?.departmentId || "",
}}
isNeedPostId={true}
onGetLabel={(label) => {
form.setFieldValue(["promisePersons", field.name, "userName"], label);
}}
mode={(promiseType === 1) ? "tags" : "multiple"}
/>
),
},
]
),
},
},
{ key: "divider3", label: promiseType === 1 ? "发状人" : "被承诺人", render: FORM_ITEM_RENDER_ENUM.DIVIDER },
{
key: "promisePeoples",
name: "promisePeoples",
span: 24,
customizeRender: true,
render: (
<>
<Divider orientation="left">
{promiseType === 1 || promiseType === "责任书"
? "发状人"
: "被承诺人"}
</Divider>
<Form.List name="promisePeoples">
{fields => (
<>
{fields.map((field, index) => (
<Row gutter={[24, 10]} key={field.key} style={{ marginBottom: 10 }}>
<Col span={24}>
<Form.Item
label="部门"
labelCol={{ span: 2 }}
wrapperCol={{ span: 22 }}
rules={
[
{ required: true, message: "请选择部门" },
]
}
name={[field.name, "departmentId"]}
>
<DepartmentSelectTree
onChange={async (departmentId) => {
form.setFieldValue(["promisePeoples", field.name, "postId"], "");
form.setFieldValue(["promisePeoples", field.name, "postName"], "");
form.setFieldValue(["promisePeoples", field.name, "userName"], "");
form.setFieldValue(["promisePeoples", field.name, "userId"], []);
if (!departmentId)
return;
getPostList(departmentId, promisePeoples?.[field.name]?.corpId, index);
}}
onGetLabel={(label) => {
form.setFieldValue(["promisePeoples", field.name, "departmentName"], label);
}}
/>
</Form.Item>
<Form.Item label="部门" noStyle name={[field.name, "departmentName"]}>
<input type="hidden" />
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
label="岗位"
rules={
[
{ required: true, message: "请选择岗位" },
]
}
name={[field.name, "postId"]}
>
<Select
onChange={(value) => {
const label = basicInfo[index].find(item => item.id === value)?.postName;
form.setFieldValue(["promisePeoples", field.name, "postName"], label);
form.setFieldValue(["promisePeoples", field.name, "userName"], "");
form.setFieldValue(["promisePeoples", field.name, "userId"], []);
}}
placeholder="请选择岗位"
showSearch
allowClear
optionFilterProp="children"
>
{(basicInfo[0] || []).map((item) => {
const value = item.id;
const label = item.postName;
return (
<Select.Option key={value} value={value}>
{label}
</Select.Option>
);
})}
</Select>
</Form.Item>
<Form.Item label="岗位" noStyle name={[field.name, "postName"]}>
<input type="hidden" />
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
label="人员"
rules={
[
{ required: true, message: "请选择人员" },
]
}
name={[field.name, "userId"]}
>
<PersonnelSelect
params={{
postId: promisePeoples?.[field.name]?.postId || "",
departmentId: promisePeoples?.[field.name]?.departmentId || "",
}}
isNeedPostId={true}
onGetLabel={(label) => {
form.setFieldValue(["promisePeoples", field.name, "userName"], label);
}}
// mode="multiple"
/>
</Form.Item>
<Form.Item label="人员" noStyle name={[field.name, "userName"]}>
<input type="hidden" />
</Form.Item>
</Col>
</Row>
))}
</>
)}
</Form.List>
</>
),
render: FORM_ITEM_RENDER_ENUM.FORM_LIST,
formListUniqueProps: {
showAddButton: false,
showRemoveButton: false,
options: field => (
[
{
name: [field.name, "departmentId"],
label: "部门",
span: 8,
labelCol: { span: 6 },
render: (
<DepartmentSelectTree
onChange={async (departmentId) => {
form.setFieldValue(["promisePeoples", field.name, "postId"], "");
form.setFieldValue(["promisePeoples", field.name, "postName"], "");
form.setFieldValue(["promisePeoples", field.name, "userName"], "");
form.setFieldValue(["promisePeoples", field.name, "userId"], "");
if (!departmentId)
return;
getPostList1(departmentId, promisePeoples?.[field.name]?.corpId);
}}
onGetLabel={(label) => {
form.setFieldValue(["promisePeoples", field.name, "departmentName"], label);
}}
/>
),
},
{ name: [field.name, "departmentName"], label: "部门名称", onlyForLabel: true },
{
name: [field.name, "postId"],
label: "岗位",
span: 8,
labelCol: { span: 6 },
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: postList1,
itemsField: { labelKey: "postName", valueKey: "id" },
componentProps: {
onChange: (event) => {
form.setFieldValue(["promisePeoples", field.name, "postName"], getLabelName({ list: postList1, status: event, nameKey: "postName", valueKey: "id" }));
form.setFieldValue(["promisePeoples", field.name, "userName"], "");
form.setFieldValue(["promisePeoples", field.name, "userId"], "");
},
},
},
{ name: [field.name, "postName"], label: "岗位名称", onlyForLabel: true },
{
name: [field.name, "userId"],
label: "人员",
span: 8,
labelCol: { span: 6 },
render: (
<PersonnelSelect
params={{
postId: promisePeoples?.[field.name]?.postId || "",
departmentId: promisePeoples?.[field.name]?.departmentId || "",
}}
isNeedPostId={true}
onGetLabel={(label) => {
form.setFieldValue(["promisePeoples", field.name, "userName"], label);
}}
/>
),
},
{ name: [field.name, "userName"], label: "人员名称", onlyForLabel: true },
]
),
},
},
]}
/>
</div>
{choiceTemplateModalOpen && (
<ChoiceTemplateModal
onCancel={() => setchoiceTemplateModalOpen(false)}
onConfirm={(values) => {
form.setFieldValue("promiseType", values.promiseType);
form.setFieldValue("promiseTypeName", getLabelName({ list: PROMISE_TYPE_ENUM, status: values.promiseType }));
form.setFieldValue("promiseText", values.promiseText);
form.setFieldValue("promisePersons", [{}]);
form.setFieldValue("promisePeoples", [{}]);
setPostList([]);
}}
/>
)}
</div>
);
}
const ChoiceTemplateModalComponent = (props) => {
const parentForm = props.parentForm; // 使用外层表单
const [form] = Form.useForm(); // ← 只给搜索用,不影响主页面
const [form] = Form.useForm();
const { tableProps, getData } = useTable(props["busPromiseTemplateList"], {
form,
useStorageQueryCriteria: false,
});
return (
<Modal
open
width={800}
width={1200}
maskClosable={false}
onCancel={props.onCancel}
footer={[
<Button key="close" onClick={() => props.onCancel()}>关闭</Button>,
]}
onCancel={props.onCancel}
>
<div style={{ padding: 20 }}>
<Search
labelCol={{ span: 8 }}
form={form}
options={[
{ name: "hiddenDesc", label: "承诺书名称" },
{ name: "likePromiseName", label: "安全承诺名称" },
]}
onFinish={getData}
/>
<Table
options={false}
disabledResizer={true}
columns={[
{ title: "承诺书名称", dataIndex: "promiseName" },
{ title: "安全承诺名称", dataIndex: "promiseName" },
{
title: "类型",
title: "安全承诺类型",
dataIndex: "promiseType",
render: (_, record) => getLabelName({ list: typeList, status: record.promiseType }),
render: (_, record) => getLabelName({ list: PROMISE_TYPE_ENUM, status: record.promiseType }),
},
{
title: "操作",
@ -633,24 +427,7 @@ const ChoiceTemplateModalComponent = (props) => {
<Button
type="link"
onClick={() => {
// 更新外层 Form主页面
parentForm.setFieldValue("promiseType", record.promiseType);
parentForm.setFieldValue("promiseTypeName", getTypeName(record.promiseType));
parentForm.setFieldValue("promiseText", record.promiseText);
parentForm.setFieldValue(
"promiseDetails",
record.templateDetails?.length
? record.templateDetails
: [{}],
);
const promisePersonsList = parentForm.getFieldValue("promisePersons");
promisePersonsList.forEach((item, index) => {
parentForm.setFieldValue(["promisePersons", index], "");
});
const promisePeoplesList = parentForm.getFieldValue("promisePeoples");
promisePeoplesList.forEach((item, index) => {
parentForm.setFieldValue(["promisePeoples", index], "");
});
props.onConfirm(record);
props.onCancel();
}}
>

View File

@ -4,6 +4,7 @@ import { useEffect, useState } from "react";
import HeaderBack from "zy-react-library/components/HeaderBack";
import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
import { getLabelName } from "zy-react-library/utils";
import { RELEASE_PLATFORM_ENUM } from "~/enumerate/constant";
import { NS_COMMITMENT } from "~/enumerate/namespace";
import DetailModal from "~/pages/Container/Supervise/Components/DetailModal";
@ -30,11 +31,11 @@ function Detail(props) {
<Descriptions
bordered
column={1}
labelStyle={{ width: 200 }}
styles={{ label: { width: 200 } }}
items={[
{ label: "承诺名称", children: detail.promiseName },
{ label: "下发对象", children: getLabelName({ list: [{ name: "分公司", bianma: 1 }, { name: "股份内部", bianma: 2 }], status: detail.releasePlatform }) },
{ label: "承诺级别", children: detail.levelName },
{ label: "安全承诺名称", children: detail.promiseName },
{ label: "下发对象", children: getLabelName({ list: RELEASE_PLATFORM_ENUM, status: detail.releasePlatform }) },
{ label: "安全承诺级别", children: detail.levelName },
{ label: "适用期限开始", children: detail.promiseTermStart },
{ label: "适用期限结束", children: detail.promiseTermEnd },
]}
@ -43,25 +44,16 @@ function Detail(props) {
<Descriptions
bordered
column={1}
labelStyle={{ width: 200 }}
styles={{ label: { width: 200 } }}
items={[
{ label: "正文", children: detail.promiseText },
...(detail.promiseDetails || []).map((item, index) => ({
label: `副文${index + 1}`,
children: item.collateral || "-",
})),
{ label: "承诺内容", children: (<div dangerouslySetInnerHTML={{ __html: detail.promiseText }} />) },
]}
/>
<Divider orientation="left">
{detail.promiseType === 1
? "受状人"
: "承诺人"}
</Divider>
<Divider orientation="left">{detail.promiseType === 1 ? "受状人" : "承诺人"}</Divider>
<Descriptions
bordered
column={2}
labelStyle={{ width: 200 }}
styles={{ label: { width: 200 } }}
items={[
...(detail.promisePersons || []).flatMap((item, index) => {
const base = [
@ -82,15 +74,11 @@ function Detail(props) {
}),
]}
/>
<Divider orientation="left">
{detail.promiseType === 1
? "发状人"
: "被承诺人"}
</Divider>
<Divider orientation="left">{detail.promiseType === 1 ? "发状人" : "被承诺人"}</Divider>
<Descriptions
bordered
column={2}
labelStyle={{ width: 200 }}
styles={{ label: { width: 200 } }}
items={[
{ label: "部门", children: detail.promisePeople?.departmentName || "-", span: 2 },
{ label: "岗位", children: detail.promisePeople?.postName || "-" },

View File

@ -1,5 +1,7 @@
import { Permission } from "@cqsjjb/jjb-common-decorator/permission";
import { tools } from "@cqsjjb/jjb-common-lib";
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, message, Modal, Select, Space, Tooltip } from "antd";
import { Button, Form, message, Modal, Space, Tabs, Tooltip } from "antd";
import { useEffect, useState } from "react";
import AddIcon from "zy-react-library/components/Icon/AddIcon";
import Search from "zy-react-library/components/Search";
@ -8,18 +10,24 @@ import Table from "zy-react-library/components/Table";
import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender";
import useTable from "zy-react-library/hooks/useTable";
import { getLabelName } from "zy-react-library/utils";
import { PROMISE_TYPE_ENUM, RELEASE_PLATFORM_ENUM } from "~/enumerate/constant";
import { NS_COMMITMENT } from "~/enumerate/namespace";
const { query } = tools.router;
function List(props) {
const [form] = Form.useForm();
const [releasePlatform, setReleasePlatform] = useState(query.releasePlatform || RELEASE_PLATFORM_ENUM[0].bianma);
const [dorpInfo, setDorpInfo] = useState("");
const { tableProps, getData } = useTable(props["busPromiseList"], {
form,
transform: formData => ({
eqCreateTimeS: formData.createTime?.[0],
eqCreateTimeE: formData.createTime?.[1],
}),
params: {
eqReleasePlatform: releasePlatform,
},
});
const [dorpInfo, setDorpInfo] = useState("");
const getDorpInfo = async () => {
const { data } = await props["corpInfo"]({ enterpriseType: 2, pageSize: 1000, pageIndex: 1 });
setDorpInfo(data);
@ -44,66 +52,96 @@ function List(props) {
});
}
};
// eqReleasePlatform 下发对象
return (
<div style={{ padding: 20 }}>
<Search
labelCol={{ span: 8 }}
form={form}
options={[
{ name: "likePromiseName", label: "承诺书名称" },
{ name: "eqLevel", label: "承诺书级别", render: (<DictionarySelect dictValue="PROMISE_LEVEL" onGetLabel={label => form.setFieldValue("levelName", label)} />) },
{ name: "eqPromiseType", label: "承诺书类型", render: FORM_ITEM_RENDER_ENUM.SELECT, items: [{ name: "承诺书", bianma: 0 }, { name: "责任书", bianma: 1 }] },
{ name: "eqReleasePlatform", label: "下发对象", render: FORM_ITEM_RENDER_ENUM.SELECT, items: [{ name: "分公司", bianma: 1 }, { name: "股份内部", bianma: 2 }] },
{ name: "likePromiseName", label: "安全承诺名称" },
{ name: "eqLevel", label: "安全承诺级别", render: (<DictionarySelect dictValue="PROMISE_LEVEL" />) },
{
name: "eqPromiseType",
label: "安全承诺类型",
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: PROMISE_TYPE_ENUM,
},
{
name: "eqSignState",
label: "签署状态",
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: [{ bianma: "0", name: "已完成" }, { bianma: "1", name: "未完成" }],
},
{ name: "createTime", label: "下发时间", render: FORM_ITEM_RENDER_ENUM.DATE_RANGE },
{ name: "eqCorpId", label: "签订单位", render: (
<Select
placeholder="请选择签订单位"
showSearch
allowClear
optionFilterProp="children"
>
{(dorpInfo || []).map((item) => {
const value = item.id;
const label = item.corpName;
return (
<Select.Option key={value} value={value}>
{label}
</Select.Option>
);
})}
</Select>
) },
{
name: "eqCorpId",
label: "签订单位",
render: FORM_ITEM_RENDER_ENUM.SELECT,
items: dorpInfo,
itemsField: { labelKey: "corpName", valueKey: "id" },
},
]}
onFinish={getData}
/>
<Table
headerTitle={(
<Tabs
activeKey={releasePlatform}
items={RELEASE_PLATFORM_ENUM.map(item => ({
key: item.bianma,
label: item.name,
}))}
onChange={(event) => {
query.releasePlatform = event;
setReleasePlatform(event);
getData();
}}
/>
)}
toolBarRender={() => (
<>
<Button
type="primary"
icon={<AddIcon />}
onClick={() => {
props.history.push("./add");
}}
>
新增
</Button>
{props.permission("jg-promise-management-add") && (
<Button
type="primary"
icon={<AddIcon />}
onClick={() => {
props.history.push("./add");
}}
>
新增
</Button>
)}
</>
)}
columns={[
{ title: "承诺书名称", dataIndex: "promiseName" },
{ title: "下发对象", dataIndex: "releasePlatform", render: (_, record) => getLabelName({ list: [[{ name: "分公司", bianma: 1 }, { name: "股份内部", bianma: 2 }]], status: record.releasePlatform }) },
{ title: "承诺书级别", dataIndex: "levelName" },
{ title: "承诺书类型", dataIndex: "promiseType", render: (_, record) => getLabelName({ list: [{ name: "承诺书", bianma: 0 }, { name: "责任书", bianma: 1 }], status: record.promiseType }) },
{ title: "安全承诺名称", dataIndex: "promiseName" },
{
title: "安全承诺类型",
dataIndex: "promiseType",
render: (_, record) => getLabelName({ list: PROMISE_TYPE_ENUM, status: record.promiseType }),
},
{ title: "安全承诺级别", dataIndex: "levelName" },
{
title: "下发对象",
dataIndex: "releasePlatform",
render: (_, record) => getLabelName({ list: RELEASE_PLATFORM_ENUM, status: record.releasePlatform }),
},
{ title: "签订单位", dataIndex: "corpName" },
{ title: "涉及岗位", dataIndex: "postNames" },
{ title: "适用期限", render: (_, record) => `${record.promiseTermStart}${record.promiseTermEnd}` },
{ title: "承诺人数/涉及人数", dataIndex: "signedCount" },
{ title: "涉及岗位", dataIndex: "postNames" },
{ title: "承诺人数/涉及人数", dataIndex: "signedCount", render: (_, record) => `已完成${record.signedCount}/${record.peopleNumInvolved}` },
{ title: "下发时间", dataIndex: "updateTime" },
{ title: "状态", render: (_, record) => getLabelName({ list: [{ name: "启用", bianma: "0" }, { name: "禁用", bianma: "1" }], status: record.state }) },
{
title: "状态",
render: (_, record) => getLabelName({
list: [{ name: "已下发", bianma: "0" }, { name: "暂存", bianma: "1" }],
status: record.state,
}),
},
{
title: "操作",
width: 200,
width: 220,
fixed: "right",
render: (_, record) => (
<Space>
@ -115,28 +153,32 @@ function List(props) {
>
查看
</Button>
<Tooltip title="下发后不可编辑" placement="top">
{props.permission("jg-promise-management-issue") && (
<Tooltip title="下发后不可编辑" placement="top">
<Button
type="link"
onClick={() => handleRelease(record.id, record.state)}
disabled={record.state === 0}
>
下发
</Button>
</Tooltip>
)}
{props.permission("jg-promise-management-edit") && (
<Button
type="link"
onClick={() => handleRelease(record.id, record.state)}
onClick={() => {
props.history.push(`./add?id=${record.id}`);
}}
disabled={record.state === 0}
>
下发
编辑
</Button>
</Tooltip>
)}
<Button
type="link"
onClick={() => {
props.history.push(`./add?id=${record.id}`);
}}
disabled={record.state === 0}
>
编辑
</Button>
<Button
type="link"
onClick={() => {
props.history.push(`./Release?id=${record.promiseId}`);
props.history.push(`./Release?id=${record.id}&promiseId=${record.promiseId}`);
}}
disabled={record.state !== 0}
>
@ -153,4 +195,4 @@ function List(props) {
);
}
export default Connect([NS_COMMITMENT], true)(List);
export default Connect([NS_COMMITMENT], true)(Permission(List));

View File

@ -14,16 +14,30 @@ function List(props) {
const [form] = Form.useForm();
const { tableProps } = useTable(props["busPromisePeople"], {
form,
params: { eqPromiseId: query.id },
params: { eqPromiseId: query.promiseId },
});
const [busPromiseTemplateModalOpen, setBusPromiseTemplateModalOpen] = useState(false);
const [id, setId] = useState("");
const [modalUrl, setModalUrl] = useState("");
return (
<div>
<HeaderBack title="查看" />
<HeaderBack title="签署详情" />
<div style={{ padding: 20 }}>
<Table
toolBarRender={() => (
<Space>
<Button
type="primary"
onClick={() => {
setBusPromiseTemplateModalOpen(true);
setId(query.id);
setModalUrl("busPromisePeopleAllSign");
}}
>
签署汇总
</Button>
</Space>
)}
columns={[
{ title: "部门", dataIndex: "departmentName" },
{ title: "岗位", dataIndex: "postName" },

View File

@ -16,10 +16,9 @@ function List(props) {
return (
<div style={{ padding: 20 }}>
<Search
labelCol={{ span: 8 }}
form={form}
options={[
{ name: "hiddenDesc", label: "分公司名称" },
{ name: "corpName", label: "分公司名称" },
{ name: "promiseType", label: "年份", render: FORM_ITEM_RENDER_ENUM.DATE_YEAR },
]}
onFinish={getData}
@ -28,9 +27,9 @@ function List(props) {
columns={[
{ title: "分公司名称", dataIndex: "corpName" },
{ title: "年份", render: record => record.createTime ? dayjs(record.createTime).format("YYYY") : "" },
{ title: "承诺数", dataIndex: "promiseCount" },
{ title: "下发承诺人数", dataIndex: "issueCount" },
{ title: "签订承诺人数", dataIndex: "signCount" },
{ title: "安全承诺数", dataIndex: "promiseCount" },
{ title: "下发安全承诺人数", dataIndex: "issueCount" },
{ title: "签订安全承诺人数", dataIndex: "signCount" },
{
title: "操作",
width: 150,

View File

@ -23,18 +23,17 @@ function List(props) {
<HeaderBack title="查看" />
<div style={{ padding: 20 }}>
<Search
labelCol={{ span: 8 }}
form={form}
options={[
{ name: "likePromiseName", label: "承诺名称" },
{ name: "likePromiseName", label: "安全承诺名称" },
]}
onFinish={getData}
/>
<Table
columns={[
{ title: "承诺名称", dataIndex: "promiseName" },
{ title: "安全承诺名称", dataIndex: "promiseName" },
{ title: "承诺期限", render: (record) => { return record.promiseTermStart ? `${dayjs(record.promiseTermStart).format("YYYY-MM-DD")}${dayjs(record.promiseTermEnd).format("YYYY-MM-DD")}` : ""; } },
{ title: "承诺级别", dataIndex: "levelName" },
{ title: "安全承诺级别", dataIndex: "levelName" },
{ title: "涉及人数", dataIndex: "peopleNumInvolved" },
{ title: "完成提交人数", dataIndex: "signedCount" },
{

View File

@ -1,5 +1,5 @@
import { Connect } from "@cqsjjb/jjb-dva-runtime";
import { Button, Form, Space } from "antd";
import { Button, Space } from "antd";
import { useState } from "react";
import HeaderBack from "zy-react-library/components/HeaderBack";
import Table from "zy-react-library/components/Table";
@ -10,13 +10,11 @@ import { NS_COMMITMENT } from "~/enumerate/namespace";
import DetailModal from "~/pages/Container/Supervise/Components/DetailModal";
function List(props) {
const [form] = Form.useForm();
const [busPromiseTemplateModalOpen, setBusPromiseTemplateModalOpen] = useState(false);
const [id, setId] = useState("");
const [modalUrl, setModalUrl] = useState("");
const query = useGetUrlQuery();
const { tableProps } = useTable(props["busPromisePeopleList"], {
form,
params: {
eqCorpId: query.id,
},
@ -30,7 +28,7 @@ function List(props) {
columns={[
{ title: "所属部门", dataIndex: "departmentName" },
{ title: "姓名", dataIndex: "userName" },
{ title: "签署情况", dataIndex: "isSign", render: (_, record) => getLabelName({ list: [{ name: "未签署", bianma: "0" }, { name: "已签署", bianma: "1" }], status: record.isSign }) },
{ title: "签署状态", dataIndex: "isSign", render: (_, record) => getLabelName({ list: [{ name: "未签署", bianma: "0" }, { name: "已签署", bianma: "1" }], status: record.isSign }) },
{
title: "操作",
width: 150,

View File

@ -3,12 +3,12 @@ import { Image, Modal } from "antd";
import dayjs from "dayjs";
import { useEffect, useRef, useState } from "react";
import { useReactToPrint } from "react-to-print";
import PreviewImg from "zy-react-library/components/PreviewImg";
import { getFileUrl } from "zy-react-library/utils";
import { NS_COMMITMENT } from "~/enumerate/namespace";
// Info.jsx
import "./index.less";
const Info = (props) => {
const DetailModal = (props) => {
const [form, setForm] = useState({});
const getData = async () => {
if (props.id) {
@ -17,7 +17,7 @@ const Info = (props) => {
}
};
useEffect(() => {
props.id && getData();
getData();
}, []);
const contentRef = useRef(null);
const handlePrint = useReactToPrint({
@ -61,17 +61,11 @@ const Info = (props) => {
{form.promiseType === 0 && (
<div>
{`${form.userName}` || ""}
{`${form.userName ? `${form.userName}:` : ""}` || ""}
</div>
)}
<div className="text">{form.promiseText}</div>
<div className="collateral">
{form.templateDetails?.map((item, index) => (
<div key={index} className="item">{item.collateral}</div>
))}
</div>
<div className="text" dangerouslySetInnerHTML={{ __html: form.promiseText }} />
<div className="text">
{form.promiseType === 0
@ -95,7 +89,6 @@ const Info = (props) => {
)
: (
<div className="promiser">
<span style={{ marginRight: form.filepath ? "0px" : "105px" }}>
发状人
<Image src={getFileUrl() + form.filepath} alt="sign" width={100} height={100} />
@ -111,6 +104,8 @@ const Info = (props) => {
<span style={{ marginRight: form.filepath ? "0px" : "105px" }}>
{form.promiseType === 0 ? "承诺人(本人签字)" : "受状人"}
{(form.filepath && !form.signList) && <Image src={getFileUrl() + form.filepath} alt="sign" width={100} height={100} />}
{form.signList && <PreviewImg files={form.signList} />}
</span>
</div>
</div>
@ -118,8 +113,7 @@ const Info = (props) => {
</div>
</div>
</Modal>
</>
);
};
export default Connect([NS_COMMITMENT], true)(Info);
export default Connect([NS_COMMITMENT], true)(DetailModal);