import { Row, Col, Input, InputNumber, Select, message, Button, Empty, Checkbox, Divider, } from "antd"; import React, { useRef, useEffect, useState, useMemo } from "react"; import { bmNoRule } from "@/services/platform"; import { useRequest } from "umi"; import moment from "moment"; import Login from "@/pages/user/Login"; let Diyrule = (props) => { let { onChange, extraparams } = props; let other = useMemo(() => { return ( props?.value?.other || { noRuleCode: "", sort: null, formatType: 3, increaseList: [], } ); }, [props?.value?.other]), value = props?.value?.value ?? []; let { data, loading } = useRequest( () => { return bmNoRule(extraparams); }, { formatResult: (res) => res?.data?.dataList, refreshDeps: [extraparams], } ); useEffect(() => { let noRuleCode = data && data .map((it) => ({ ...it, label: it.name })) .filter((it) => it.value == "increasing_order")[0]?.value; //获取默认值 顺序递增 if (!other.noRuleCode) { onChange({ value: value, other: { ...other, noRuleCode: noRuleCode, }, }); } }, [data]); function renderDom(row, type) { if (type == "middle") { let dom = <></>; switch (row.noRuleCode) { case "text_input": dom = ( <> <p style={{ color: "#999", marginBottom: 24 }}>编号内容</p> <Input allowClear value={row.noContent} onChange={(e) => { let val = e.target.value; let newvalue = JSON.parse(JSON.stringify(value)) || []; newvalue = newvalue.map((item) => { if (item.id == row.id) { item.noContent = val; } return item; }); onChange({ value: newvalue, other: other, }); }} /> </> ); break; case "year_code": dom = ( <> <p style={{ color: "#999", marginBottom: 24 }}>年份代码</p> <Select value={row.formatType} options={[ { label: "YYYY", value: 1, }, { label: "YY", value: 2, }, ]} onChange={(val) => { let newvalue = JSON.parse(JSON.stringify(value)) || []; newvalue = newvalue.map((item) => { if (item.id == row.id) { item.formatType = val; } return item; }); onChange({ value: newvalue, other: other, }); }} /> </> ); break; case "month_code": dom = ( <> <p style={{ color: "#999", marginBottom: 24 }}>月份代码</p> <Select value={row.formatType} options={[ { label: "MM", value: 2, }, { label: "M", value: 1, }, ]} onChange={(val) => { let newvalue = JSON.parse(JSON.stringify(value)) || []; newvalue = newvalue.map((item) => { if (item.id == row.id) { item.formatType = val; if (val == 1) { item.paramList = Object.keys( Array.apply(null, { length: 12 }) ).map((it, i) => { return { key: (i + 1).toString(), value: "", }; }); } else { delete item.paramList; } } return item; }); onChange({ value: newvalue, other: other, }); }} /> </> ); break; case "day_code": dom = ( <> <p style={{ color: "#999", marginBottom: 24 }}>日期类型</p> <Select value={row.formatType} options={[ { label: "DD", value: 2, }, { label: "D", value: 1, }, ]} onChange={(val) => { let newvalue = JSON.parse(JSON.stringify(value)) || []; newvalue = newvalue.map((item) => { if (item.id == row.id) { item.formatType = val; if (val == 1) { item.paramList = Object.keys( Array.apply(null, { length: 31 }) ).map((it, i) => { return { key: (i + 1).toString(), value: "", }; }); } else { delete item.paramList; } } return item; }); onChange({ value: newvalue, other: other, }); }} /> </> ); break; } return dom; } else if (type == "last") { let dom = <></>; switch (row.noRuleCode) { case "month_code": if (row.formatType == 1) { dom = ( <> <Row style={{ marginTop: 24 }}> {row.paramList && row.paramList.map((it) => { return ( <Col key={it.key} span={4} style={{ display: "flex", justifyContent: "center", alignItems: "center", border: "#f0f0f0 solid 1px", flexDirection: "column", backgroundColor: "#f0f0f0", }} > <div style={{ height: 36 }} className="center"> {it.key}月 </div> <div> <Input style={{ width: "100%", textAlign: "center" }} value={it.value} onChange={(e) => { //修改list数据 let val = e.target.value; let newparamList = JSON.parse(JSON.stringify(row.paramList)) || []; newparamList = newparamList.map((item) => { if (item.key == it.key) { item.value = val; } return item; }); //修改整体数据 let newvalue = JSON.parse(JSON.stringify(value)) || []; newvalue = newvalue.map((item) => { if (item.id == row.id) { item.paramList = newparamList; } return item; }); onChange({ value: newvalue, other: other, }); }} ></Input> </div> </Col> ); })} </Row> </> ); } break; case "day_code": if (row.formatType == 1) { dom = ( <> <Row style={{ marginTop: 24 }}> {row.paramList && row.paramList.map((it) => { return ( <Col span={3} style={{ display: "flex", justifyContent: "center", alignItems: "center", border: "#f0f0f0 solid 1px", flexDirection: "column", backgroundColor: "#f0f0f0", }} > <div style={{ height: 36 }} className="center"> {it.key}号 </div> <div> <Input style={{ width: "100%", textAlign: "center" }} value={it.value} onChange={(e) => { //修改list数据 let val = e.target.value; let newparamList = JSON.parse(JSON.stringify(row.paramList)) || []; newparamList = newparamList.map((item) => { if (item.key == it.key) { item.value = val; } return item; }); //修改整体数据 let newvalue = JSON.parse(JSON.stringify(value)) || []; newvalue = newvalue.map((item) => { if (item.id == row.id) { item.paramList = newparamList; } return item; }); onChange({ value: newvalue, other: other, }); }} ></Input> </div> </Col> ); })} </Row> </> ); } break; } return dom; } } return ( <div style={{ overflow: "hidden", lineHeight: 0, paddingTop: 12 }}> <div style={{ overflow: "hidden" }}> {value && value.length > 0 && value.map((it, i) => { return ( <Row key={i} style={{ padding: "6px 0 12px 0" }} gutter={24}> <Col span={3}> <p style={{ color: "#999", marginBottom: 24 }}>关联规则</p> <Checkbox checked={ other.increaseList && other.increaseList.indexOf(it.id) != -1 } onChange={(e) => { let checked = e.target.checked; if (checked) { let newlist = [...other.increaseList]; newlist.push(it.id); onChange({ value: value, other: { ...other, increaseList: newlist, }, }); } else { onChange({ value: value, other: { ...other, increaseList: other.increaseList.filter((item) => { return item != it.id; }), }, }); } }} > 选择 </Checkbox> </Col> <Col span={9}> <p style={{ color: "#999", marginBottom: 24 }}>编号规则</p> <Select style={{ width: "100%" }} options={ data && data .filter((it) => it.value != "increasing_order") .map((it) => ({ ...it, label: it.name })) } value={it.noRuleCode} onChange={(val) => { let newvalue = JSON.parse(JSON.stringify(value)) || []; newvalue = newvalue.map((item) => { if (item.id == it.id) { return { noRuleCode: val, id: item.id, }; } else { return item; } }); onChange({ value: newvalue, other: other, }); }} /> </Col> <Col span={10}>{renderDom(it, "middle")}</Col> <Col span={2}> <p style={{ color: "#999", marginBottom: 40 }}>操作</p> <a style={{ color: "red" }} onClick={() => { let newvalue = JSON.parse(JSON.stringify(value)) || []; newvalue = newvalue.filter((item) => { return it.id != item.id; }); onChange({ value: newvalue, other: { ...other, increaseList: other.increaseList.filter((item) => { return item != it.id; }), sort: other.sort == i + 1 ? null : other.sort, }, }); }} > 删除 </a> </Col> <Col span={24}>{renderDom(it, "last")}</Col> <Divider></Divider> </Row> ); })} <Row style={{ padding: "12px 0" }} gutter={24}> <Col span={3}> <p style={{ color: "#999", marginBottom: 24 }}>关联规则</p> <Checkbox checked={ value && other.increaseList && value.length == other.increaseList.length } indeterminate={ other.increaseList ? other.increaseList.length == 0 ? false : value && value.length != other.increaseList.length : false } onChange={(e) => { let all = value.map((it, i) => it.id); if (e.target.checked) { onChange({ value: value, other: { ...other, increaseList: all, }, }); } else { onChange({ value: value, other: { ...other, increaseList: [], }, }); } }} > 全选 </Checkbox> </Col> <Col span={9}> <p style={{ color: "#999", marginBottom: 24 }}>编号规则</p> <Select style={{ width: "100%" }} options={data && data.map((it) => ({ ...it, label: it.name }))} value={other.noRuleCode} disabled={true} /> </Col> <Col span={8}> <p style={{ color: "#999", marginBottom: 24 }}> 递增位数 ( {other?.formatType && other?.formatType > 0 ? Object.keys( Array.apply("0", { length: other?.formatType }) ).reduce((prev, current) => { return prev + "0"; }) : "-"} ) </p> <InputNumber style={{ width: "100%" }} min={1} max={5} value={other?.formatType} onChange={(val) => { onChange({ value: value, other: { ...other, formatType: val, }, }); }} ></InputNumber> </Col> <Col span={4}> <p style={{ color: "#999", marginBottom: 24 }}>放置在第几个之后</p> <Select value={other?.sort} options={Object.keys( Array.apply(null, { length: value ? value.length : 0 }) ).map((it, i) => ({ label: `第${i + 1}个`, value: i + 1, }))} onChange={(val) => { onChange({ value: value, other: { ...other, sort: val, }, }); }} ></Select> </Col> </Row> </div> <Row style={{ padding: "12px 0" }} gutter={24}> <Col span={12}> <Button type="dashed" style={{ width: "100%" }} onClick={() => { let newvalue = JSON.parse(JSON.stringify(value)) || []; newvalue.unshift({ noRuleCode: "", id: moment().valueOf(), }); onChange({ value: newvalue, other: other, }); }} > 添加到顶部 </Button> </Col> <Col span={12}> <Button type="primary" ghost style={{ width: "100%" }} onClick={() => { let newvalue = JSON.parse(JSON.stringify(value)) || []; newvalue.push({ noRuleCode: "", id: moment().valueOf(), }); onChange({ value: newvalue, other: other, }); }} > 添加到底部 </Button> </Col> </Row> </div> ); }; export default Diyrule;