import React, { useState, useRef, useReducer } from "react"; import { Button, Tooltip, Row, Divider, Drawer, Form, message } from "antd"; import AutoTable from "@/components/AutoTable"; import getPrem from "@/utils/getPrem"; //权限判断fn import { useRequest } from "umi"; import defaultFields from "./fields"; import { doFetch } from "@/utils/doFetch"; import Details from "@/components/Details"; import { materielDetail } from "@/utils/detailTotalCard"; import InitForm from "@/components/InitForm"; import moment from "moment"; import TreeRender from "@/components/TreeRender"; import { useEffect } from "react"; const initState = { vs: false, fields: {}, iftype: {}, curitem: {}, detail: { dataSource: {}, totalCard: [], }, visible: false, specificFileds: {}, commonFields: {}, defaultCommonFields: [], }, otherBasic = { materieCode: "物料编号", materieName: "物料名称", materieTypeName: "物料类型", productionUnitName: "生产单位(主)", processLineName: "工艺路线", }; function reducer(state, action) { let { type } = action, newState = {}; switch (type) { case "add": newState = { ...state, vs: true, iftype: { title: "新增物料", val: type, }, fields: { ...action.fields }, commonFields: action.commonFields, specificFileds: action.specificFileds, }; break; case "edit": newState = { ...state, vs: true, iftype: { title: "编辑物料", val: type, }, fields: { ...action.fields }, curitem: action.curitem, commonFields: action.commonFields, specificFileds: action.specificFileds, defaultCommonFields: action.defaultCommonFields, }; break; case "bom": newState = { ...state, vs: true, iftype: { title: "编辑物料BOM", val: type, }, fields: { ...action.fields }, curitem: action.curitem, markKey: action.markKey, }; break; case "see": newState = { ...state, detail: { dataSource: action.dataSource, totalCard: action.totalCard, }, visible: true, }; break; case "changeSpecificFileds": newState = { ...state, specificFileds: action.specificFileds, }; break; case "changeFields": newState = { ...state, fields: action.fields, }; break; case "changeCommonFields": newState = { ...state, commonFields: action.commonFields, }; break; case "changeDefaultCommonFields": newState = { ...state, defaultCommonFields: action.defaultCommonFields, }; break; case "close": newState = { vs: false, fields: {}, iftype: {}, curitem: {}, detail: { dataSource: {}, totalCard: [], }, visible: false, specificFileds: {}, }; break; } return newState; } const Materiel = (props) => { let actionRef = useRef(), ChildRef = null, [formRef] = Form.useForm(), [formRefs] = Form.useForm(); const [materieTypeId, setmaterieTypeId] = useState(); const [defaultSpecificFileds, setdefaultSpecificFileds] = useState(); function reload() { actionRef?.current?.reload(); ChildRef?.onRefresh(); } const { run, loading } = useRequest(doFetch, { manual: true, formatResult: (res) => res, onSuccess: (result, params) => { if (result.code == "0000") { reload(); dispatch({ type: "close" }); } }, }), [state, dispatch] = useReducer(reducer, initState), { vs, fields, iftype, curitem, detail, visible, specificFileds, commonFields, defaultCommonFields, markKey, } = state, columns = [ { title: "物料编码", dataIndex: "materieCode", key: "materieCode", }, { title: "物料名称", dataIndex: "materieName", key: "materieName", render: (_, row) => { return ( <Tooltip title={row.materieName}> <a className="table-cell" onClick={() => { doFetch({ url: "/ngic-workmanship/pmMaterie/queryDetailById", params: { id: row.id }, }).then((res) => { if (res.code == "0000") { let dataSource = res?.data?.data ?? {}, specials = res?.data?.data?.materieCharList ?? []; let newData = formatFieds(specials, "special")?.data; let newSpecialData = newData.map((it) => { dataSource[it.fieldsKey] = it.fieldRealValue; return { title: it.fieldName, key: it.fieldsKey, }; }); let itemCol = [ { cardTitle: "特殊属性", itemData: newSpecialData, }, ]; dataSource.newqualityGuaranteePeriod = dataSource.qualityGuaranteePeriod == 0 || dataSource.qualityGuaranteePeriod ? dataSource.qualityGuaranteePeriod + dataSource.qualityGuaranteePeriodUnitName : null; let totalCard = materielDetail.concat(itemCol); dispatch({ type: "see", dataSource, totalCard }); } }); }} > {row.materieName} </a> </Tooltip> ); }, }, { title: "物料类型", dataIndex: "materieTypeName", key: "materieTypeName", }, { title: "管控方式", dataIndex: "materieControlName", key: "materieControlName", options: { database: () => doFetch({ url: "/ngic-base-business/sysDic/queryMaterieControlSelect", }), params: {}, }, valueType: "select", formItemProps: { name: "materieControl", }, }, { title: "铁损", dataIndex: "ironLoss", key: "ironLoss", valueType: "digit", }, { title: "片厚", dataIndex: "sheetThickness", valueType: "digit", key: "sheetThickness", }, // { // title: "单边厚度", // dataIndex: "unilateralThickness", // key: "unilateralThickness", // }, { title: "默认库区", dataIndex: "storeAreaName", key: "storeAreaName", search: false, }, { title: "操作", dataIndex: "option_dataindex", key: "option_dataindex", valueType: "option", width: 160, render: (text, row, _, action) => extraAction(text, row, _, action), }, ]; useEffect(() => { doFetch({ url: "/ngic-workmanship/pmMaterieChar/queryCommonList", params: {}, }).then((res) => { console.log("第一次获取的", res?.data?.dataList); setdefaultSpecificFileds(res?.data?.dataList); }); }, []); function extraAction(text, record, _, action) { return [ getPrem("sysDepartment_save", action, "修改", () => { doFetch({ url: "/ngic-workmanship/pmMaterie/queryDetailById", params: { id: record.id }, }).then((res) => { if (res.code == "0000") { let data = res?.data?.data ?? {}; let newArr = data?.materieProductUnitList?.map((it) => { return { productionUnit: it.productionUnit, productionUnitType: it.productionUnitType, id: it.id, }; }) ?? []; for (let i in defaultFields) { defaultFields[i].value = data[i]; if (i == "unitList") { defaultFields[i].value = [ { id: moment().valueOf(), productionUnit: data?.productionUnit, productionUnitType: data?.productionUnitType, }, ...newArr, ]; } } let all = async () => { let common = await doFetch({ url: "/ngic-workmanship/pmMaterieChar/queryCommonList", params: { id: record.id }, }); return { commonData: common?.data?.dataList, }; }; all().then((res) => { let commonDataFields = formatFieds( res?.commonData, "common" )?.obj, newCommonData = formatFieds(res?.commonData, "common")?.data; dispatch({ type: "edit", fields: defaultFields, curitem: record, commonFields: commonDataFields, specificFileds: { ...commonDataFields }, defaultCommonFields: newCommonData, }); setdefaultSpecificFileds([...newCommonData]); }); } }); }), getPrem("sysDepartment_deleteById", action, "删除", null, { title: "确认删除该物料?", onConfirm: () => { run({ url: "/ngic-workmanship/pmMaterie/deleteById", params: { id: record.id }, }); }, }), ]; } let saveData = () => { //新增&修改 let difrid = iftype.val != "add" ? { id: curitem.id } : {}, params, url; if (iftype.val != "bom") { formRef .validateFields() .then((firstValues) => { console.log(firstValues); formRefs .validateFields() .then((secondFields) => { console.log(secondFields); let secondFieldsKeys = Object.keys(secondFields); console.log("defaultSpecificFileds", defaultSpecificFileds); let materieCharList = defaultSpecificFileds.map((it) => { if (secondFieldsKeys.indexOf(it.fieldsKey) != -1) { it.fieldRealValue = secondFields[it.fieldsKey]; } const el = { fieldType: it.fieldType, fieldTypeName: it.fieldTypeName, fieldCondName: it.fieldCondName, fieldCondKey: it.fieldCondKey, optCondName: it.optCondName, optCondKey: it.optCondKey, fieldId: it.fieldId, fieldName: it.fieldName, fieldChar: it.fieldChar, fieldCharName: it.fieldCharName, fieldCharValue: it.fieldCharValue, fieldRealValue: it.fieldRealValue, valueList: it.valueList, }; return el; }); let materieProductUnitList = firstValues?.materieProductUnitList?.map((it) => { return { productionUnit: it.productionUnit, conversionRate: it.conversionRate, }; }); for (let i in firstValues) { if (firstValues[i] === undefined) { firstValues[i] = null; } } params = { ...firstValues, materieCharList, ...difrid, materieProductUnitList, }; url = "/ngic-workmanship/pmMaterie/save"; run({ url, params }); }) .catch((error) => {}); }) .catch((error) => {}); } else { url = "/ngic-workmanship/pmMaterie/saveMaterieBom"; let firstValues = formRef?.getFieldsValue(); let materieBomList = firstValues?.materieBomList?.map((it, i) => { return { materieId: it.id, materieName: it.materieName, materieCode: it.materieCode, materieType: it.materieType, numberUnits: it.numberUnits, workingProduceId: it.workingProduceId, workingFeedingId: it.workingFeedingId, rowKey: String(i), productionUnitName: it.productionUnitName, }; }); params = { materieBomList, ...difrid, }; run({ url, params }); } }; let extrarender = [ <Button disabled={!getPrem("sysDepartment_save", "ifs")} type="primary" onClick={() => { doFetch({ url: "/ngic-workmanship/pmMaterieChar/queryCommonList", params: {}, }).then((res) => { if (res.code == "0000") { let data = res?.data?.dataList, otherFields = formatFieds(data, "common")?.obj, newData = formatFieds(data, "common")?.data; console.log("点击新增获取的,", data); for (let i in defaultFields) { defaultFields[i].value = null; defaultFields[i].disabled = false; if ( i == "serialNumberRuleId" || i == "labelTemplateId" || i == "processLineId" ) { defaultFields[i].required = false; } if (i == "materieControl") { defaultFields[i].value = 1; } if (i == "issueType") { defaultFields[i].value = 2; } if (i == "materieTypeId") { defaultFields[i].value = materieTypeId == "00000000" ? null : materieTypeId; } } dispatch({ type: "add", fields: defaultFields, commonFields: otherFields, specificFileds: otherFields, }); dispatch({ type: "changeDefaultCommonFields", defaultCommonFields: newData, }); } }); }} > 新增 </Button>, ]; function formatFieds(data, type) { let obj = {}; for (let i = 0; i < data.length; i++) { let item = data[i], fieldsKey = type + "field" + i; item["fieldsKey"] = fieldsKey; if (item.fieldChar == 1) { obj[fieldsKey] = { value: item?.fieldRealValue ?? "", title: item.fieldName, name: [fieldsKey], required: false, type: "input", }; } else { obj[fieldsKey] = { value: item?.fieldRealValue == 0 || item?.fieldRealValue ? item?.fieldRealValue : item.fieldChar == 4 ? [] : "", title: item.fieldName, name: [fieldsKey], required: false, type: item.fieldChar == 3 ? "radio" : "select", options: item.valueList, multiple: item.fieldChar == 4 ? true : false, }; } } return { obj, data, }; } return ( <div> <AutoTable pagetitle={props.route.name} //页面标题 pageextra={extrarender} //页面操作 新增or批量删除 columns={columns} path="/ngic-workmanship/pmMaterie/queryList" actionRef={actionRef} onRef={(node) => (ChildRef = node)} childposition="left" extraparams={{ materieTypeId: materieTypeId }} x={600} > <div style={{ width: 260, flexShrink: 0, marginTop: -4, borderRight: "1px solid #f0f0f0", paddingRight: 12, marginRight: 12, }} > <TreeRender url="/ngic-workmanship/pmMaterieType/queryTreeList" deleteurl="/ngic-workmanship/pmMaterieType/deleteById" saveurl="/ngic-workmanship/pmMaterieType/save" hasTool={true} onselected={(vals) => { setmaterieTypeId(vals[0] ?? ""); }} /> </div> </AutoTable> <Drawer title={iftype.title} visible={vs} onClose={() => dispatch({ type: "close" })} footer={false} destroyOnClose={true} getContainer={false} style={{ position: "absolute" }} width={"100%"} > { <> <InitForm formRef={formRef} fields={fields} onChange={(changedValues, allValues) => {}} actions={() => { return null; }} ></InitForm> <div style={{ fontSize: 16, fontWeight: "bold", marginBottom: 15 }}> 特定属性 </div> <InitForm formRef={formRefs} fields={specificFileds} onChange={(changedValues, allValues) => {}} actions={() => { return null; }} ></InitForm> </> } <Button style={{ width: "100%" }} type="primary" size="large" loading={loading || !vs} onClick={() => saveData()} > 提交 </Button> </Drawer> <Details title="物料详情" visible={visible} onClose={() => dispatch({ type: "close" })} footer={false} destroyOnClose={true} width={"100%"} {...detail} ></Details> </div> ); }; export default Materiel;