Commit 6861fe92ae76e6eaed41ec5f511697d05017a58b

Authored by 莫红玲
2 parents b89ffacc 913c4229

Merge remote-tracking branch 'origin/master' into bug_fix

config/routers/contract.ts
@@ -59,4 +59,12 @@ export default [ @@ -59,4 +59,12 @@ export default [
59 path: "/contract/kt/itemamount/config", //事项款设置 59 path: "/contract/kt/itemamount/config", //事项款设置
60 component: "./contract/ItemAmountSetting", 60 component: "./contract/ItemAmountSetting",
61 }, 61 },
  62 + {
  63 + path: "/contract/kt/authorization/setting", //合同授权
  64 + component: "./contract/AuthorizationSetting",
  65 + },
  66 + {
  67 + path: "/contract/kt/expressChargingStandard/setting", //快递收费标准
  68 + component: "./contract/ExpressChargingStandardSetting",
  69 + },
62 ]; 70 ];
config/routers/performance.ts
@@ -91,7 +91,7 @@ export default [ @@ -91,7 +91,7 @@ export default [
91 }, 91 },
92 /** 考评数据导入==> 查看数据清单 */ 92 /** 考评数据导入==> 查看数据清单 */
93 { 93 {
94 - path: "/morax/evaDataImport/edit/:id?", 94 + path: "/morax/evaDataImport/edit/:id?/:num?",
95 component: "./performance/EvaDataImport/EditComfirm/index", 95 component: "./performance/EvaDataImport/EditComfirm/index",
96 }, 96 },
97 97
src/pages/contract/AuthorizationSetting/api.ts 0 → 100644
  1 +import { http } from "@/typing/http";
  2 +import request from "@/utils/request";
  3 +import qs from 'qs';
  4 +import { CONTRACT_HOST, HOST } from "@/utils/host";
  5 +import { Any } from "currency.js";
  6 +
  7 +type PrResArr<T> = http.PromiseResp<T[]>;
  8 +
  9 +export interface Item {
  10 + id?:number, //授权ID
  11 + typeName?:string, //合同类型名称
  12 + createTime?:number, //创建时间
  13 + updateTime?:number, //更新时间
  14 + enabled?:boolean, //是否启用
  15 + roles?:Roles[],//授权角色
  16 +}
  17 +export interface Roles {
  18 + roleCode?:string, //角色编码
  19 + roleName?:string, //角色名称
  20 +}
  21 +export interface TypesItem {
  22 + id?: number; // id
  23 + name?: string;
  24 + fixedAmount?: boolean;
  25 + contractableTradeCompCategories?: number[];
  26 + feeType?: string;
  27 + feeTypeValue?: string;
  28 + bizType?: string;
  29 + bizTypeValue?: number;
  30 + subjectType?: string;
  31 + subjectTypeValue?: string;
  32 + servicePlaceTypes?: number[];
  33 +}
  34 +
  35 +export interface PageParams {
  36 + current?: number;
  37 + pageSize?: number;
  38 + contractTypeName?:string //合同类型名称
  39 +}
  40 +export interface SaveParams {
  41 + contractAuthId?: number;
  42 + typeId: number;//合同类型id
  43 + typeName:string //合同类型名称
  44 + roles?:Roles[],//授权角色
  45 +}
  46 +interface DelParams {
  47 + contractAuthId?: number; //合同授权id
  48 +}
  49 +
  50 +export interface DisableParams {
  51 + contractAuthId?: number;//合同授权id
  52 + enabled?: boolean;//是否启用
  53 +}
  54 +
  55 +/**
  56 + * 查询所有角色列表
  57 + */
  58 +export function getAllRoleCodeApi(params: CommonApi.RoleParams): PrResArr<CommonApi.RoleCodeVO> {
  59 + return request.get(`${HOST}/role/listAll`, { params });
  60 +}
  61 +/**
  62 + * 查询合同类型列表
  63 + */
  64 +export function getContractTypes(params: PageParams): http.PromisePageResp<TypesItem> {
  65 + return request.get(`${CONTRACT_HOST}/erp/contract/type/page`, { params });
  66 +}
  67 +
  68 +/**
  69 + * 分页查询合同授权
  70 + */
  71 +export function getContractAuthPage(params?: PageParams): http.PromisePageResp<Item> {
  72 + return request.get(`${CONTRACT_HOST}/erp/contractAuth/page`, {params});
  73 +}
  74 +
  75 +/**
  76 + * 新增合同授权/编辑合同授权
  77 + */
  78 +export function addContractAuth(params?: SaveParams): http.PromisePageResp<Any> {
  79 + return request.post(`${CONTRACT_HOST}/erp/contractAuth/save`, {...params});
  80 +}
  81 +
  82 +/**
  83 + * 删除合同授权
  84 + */
  85 + export function delContractAuth(params?: DelParams): http.PromisePageResp<Any> {
  86 + return request.post(`${CONTRACT_HOST}/erp/contractAuth/delete`, {...params});
  87 +}
  88 +
  89 +/**
  90 + * 启用或禁用
  91 + */
  92 + export function disableContractAuth(params?: DisableParams): http.PromisePageResp<Any> {
  93 + return request.post(`${CONTRACT_HOST}/erp/contractAuth/enableOrDisable`, {...params});
  94 +}
0 \ No newline at end of file 95 \ No newline at end of file
src/pages/contract/AuthorizationSetting/components/AddModel/index.tsx 0 → 100644
  1 +import React, { useCallback, useEffect, useState } from "react";
  2 +import { Modal, Skeleton, Select, Form, message } from "antd";
  3 +import * as API from '../../api';
  4 +
  5 +interface Props{
  6 + visible:boolean;
  7 + row?:API.Item;
  8 + contractTypesList:any[],
  9 + roleList:any[],
  10 + onRefresh: () => void;
  11 + onCancel?: () => void;
  12 +}
  13 +
  14 +function AddModel({visible, row, contractTypesList, roleList, onCancel, onRefresh}:Props) {
  15 + const [form] = Form.useForm();
  16 + const [loading, setLoading] = useState<boolean>(false);
  17 + const {id, roles, typeName } = row || {};
  18 + useEffect(() => {
  19 + if (id) {
  20 + form.setFieldsValue({
  21 + contractType: contractTypesList.filter((item:API.TypesItem) => item.name === typeName).map((i:any) => ({label: i.name, value: i.id}))[0],
  22 + roleCode: roles?.length && roles.map((i:any) => ({label: i.roleName, value: i.roleCode})),
  23 + });
  24 + }
  25 + }, [row]);
  26 +
  27 + /**
  28 + * @description: 表单提交
  29 + * @param {any} feildValue
  30 + * @return {*}
  31 + */
  32 + const handleSave = (feildValue: any) => {
  33 + setLoading(true);
  34 + const { roleCode, contractType } = feildValue;
  35 + const _roleCode = roleCode.length && roleCode.map((item:any) => ({roleCode: item.value, roleName: item.label }));
  36 + const params = {roles: _roleCode, typeId: contractType.value, typeName: contractType.label };
  37 + API.addContractAuth({ ...params, contractAuthId: id })
  38 + .then(res => {
  39 + message.success("操作成功");
  40 + _onCancel();
  41 + setLoading(false);
  42 + onRefresh();
  43 + })
  44 + .catch(err => {
  45 + message.error(err?.message);
  46 + setLoading(false);
  47 + });
  48 + };
  49 + /**
  50 + * @description: 关闭弹框
  51 + * @param {*}
  52 + * @return {*}
  53 + */
  54 + const _onCancel = () => {
  55 + onCancel && onCancel();
  56 + form.resetFields();
  57 + };
  58 +
  59 + return (
  60 + <Modal
  61 + title={`${id ? '编辑':'新增'}合同授权`}
  62 + visible={visible}
  63 + confirmLoading={loading}
  64 + onCancel={_onCancel}
  65 + onOk={form.submit}
  66 + cancelButtonProps={{ hidden: true }}
  67 + width="50%"
  68 + bodyStyle={{minHeight: 300}}
  69 + >
  70 + <Skeleton
  71 + loading={false}
  72 + >
  73 + <Form form={form} onFinish={handleSave} wrapperCol={{ span: 18 }} labelCol={{ span: 4 }}>
  74 + <Form.Item
  75 + label="合同类型"
  76 + name="contractType"
  77 + rules={[{ required: true, message: '请选择合同类型' }]}
  78 + >
  79 + <Select
  80 + placeholder="请选择合同类型"
  81 + showSearch
  82 + allowClear
  83 + optionFilterProp="children"
  84 + labelInValue
  85 + onSelect={(it:any) => {
  86 + const item = contractTypesList.filter((i:any) => it.value === i.id);
  87 + }}
  88 + filterOption={(input, option: any) => option?.children.indexOf(input) >= 0}
  89 + >
  90 + {
  91 + contractTypesList && contractTypesList.map((item:any) => (
  92 + <Select.Option value={item.id} key={item.id}>
  93 + {item.name}
  94 + </Select.Option>
  95 + ))
  96 + }
  97 + </Select>
  98 + </Form.Item>
  99 + <Form.Item
  100 + label="授权角色"
  101 + name="roleCode"
  102 + rules={[{ required: true, message: '请选择授权角色' }]}
  103 + >
  104 + <Select
  105 + placeholder="请选择授权角色(支持多选)"
  106 + mode="multiple"
  107 + showSearch
  108 + allowClear
  109 + showArrow
  110 + optionFilterProp="children"
  111 + labelInValue
  112 + onSelect={(it:any) => {
  113 + const item = roleList.filter((i:any) => it.value === i.roleCode);
  114 + }}
  115 + filterOption={(input, option: any) => option?.children.indexOf(input) >= 0}
  116 + >
  117 + {
  118 + roleList && roleList.map((item:any) => (
  119 + <Select.Option value={item.roleCode} key={item.id}>
  120 + {item.roleName}
  121 + </Select.Option>
  122 + ))
  123 + }
  124 + </Select>
  125 + </Form.Item>
  126 + </Form>
  127 + </Skeleton>
  128 + </Modal>
  129 + );
  130 +}
  131 +
  132 +export default AddModel;
0 \ No newline at end of file 133 \ No newline at end of file
src/pages/contract/AuthorizationSetting/components/Filter/index.tsx 0 → 100644
  1 +import React, { useCallback, useState } from "react";
  2 +import { Row, Col, Select } from "antd";
  3 +import * as common from "@/typing/common";
  4 +import _ from "lodash";
  5 +import * as API from '../../api';
  6 +
  7 +interface Props{
  8 + contractTypesList?:any[],
  9 + setParams:any,
  10 + innerParams?:any,
  11 +}
  12 +
  13 +function Filter({ contractTypesList, innerParams, setParams }:Props) {
  14 + const onChange = _.debounce((contractTypeName: string) => {
  15 + setParams({...innerParams, contractTypeName}, true);
  16 + }, 350);
  17 + return (
  18 + <Row
  19 + style={{ display: 'flex', flex: 1 }}
  20 + >
  21 + <Col span={12}>
  22 + <Select
  23 + placeholder="请选择合同类型"
  24 + showSearch
  25 + optionFilterProp="children"
  26 + allowClear
  27 + style={{ width: 200 }}
  28 + onChange={(contractTypeName) => onChange(contractTypeName)}
  29 + >
  30 + {
  31 + contractTypesList && contractTypesList.map((item:any) => (
  32 + <Select.Option value={item.name} key={item.id}>
  33 + {item.name}
  34 + </Select.Option>
  35 + ))
  36 + }
  37 + </Select>
  38 + </Col>
  39 + </Row>
  40 + );
  41 +}
  42 +
  43 +export default Filter;
0 \ No newline at end of file 44 \ No newline at end of file
src/pages/contract/AuthorizationSetting/components/RolesModel/index.tsx 0 → 100644
  1 +import React, { useCallback, useEffect, useState } from "react";
  2 +import { Modal, Form, message, Table } from "antd";
  3 +import * as API from '../../api';
  4 +
  5 +interface Props{
  6 + visible:boolean;
  7 + roles?:API.Roles[];
  8 + onRefresh: () => void;
  9 + onCancel?: () => void;
  10 +}
  11 +const { Column } = Table;
  12 +
  13 +function RolesModel({visible, roles, onRefresh, onCancel}:Props) {
  14 + return (
  15 + <Modal
  16 + title="授权角色"
  17 + visible={visible}
  18 + onCancel={onCancel}
  19 + >
  20 + <Table
  21 + dataSource={roles}
  22 + rowKey={(item: API.Roles) => `${item.roleCode}`}
  23 +
  24 + >
  25 + <Column title="角色名称" width={200} dataIndex="roleName" render={(t) => t || "-"} />
  26 + <Column title="角色编码" width={200} dataIndex="roleCode" render={(t) => t || "-"} />
  27 + </Table>
  28 + </Modal>
  29 + );
  30 +}
  31 +
  32 +export default RolesModel;
0 \ No newline at end of file 33 \ No newline at end of file
src/pages/contract/AuthorizationSetting/index.tsx 0 → 100644
  1 +import React, { useCallback, useState } from "react";
  2 +import { Button, Card, ConfigProvider, Divider, Input, message, Popconfirm, Select, Table } from "antd";
  3 +import { PageHeaderWrapper } from "@ant-design/pro-layout";
  4 +import zhCN from "antd/lib/locale-provider/zh_CN";
  5 +import usePagination from "@/hooks/usePagination";
  6 +import useInitial from "@/hooks/useInitail";
  7 +import { PlusOutlined } from "@ant-design/icons";
  8 +import AddModel from './components/AddModel';
  9 +import RolesModel from './components/RolesModel';
  10 +import Filter from './components/Filter';
  11 +import * as API from './api';
  12 +import _ from "lodash";
  13 +import moment from 'moment';
  14 +import st from "./style.less";
  15 +
  16 +const { Column } = Table;
  17 +function AuthorizationSetting() {
  18 + const [visible, setVisible] = useState<boolean>(false);
  19 + const [searchValue, setSearchValue] = useState<API.Item>({});
  20 + const [rolesVisible, setRolesVisible] = useState<boolean>(false);
  21 + const [row, setRow] = useState<API.Item>();
  22 + const [roles, setRoles] = useState<API.Roles[]>();
  23 + const {data: roleList} = useInitial<CommonApi.RoleCodeVO[], any>(API.getAllRoleCodeApi, [], {});
  24 + const {
  25 + list: authList,
  26 + paginationConfig,
  27 + loading,
  28 + innerParams,
  29 + setParams,
  30 + } = usePagination<API.Item>(API.getContractAuthPage, {current: 1, pageSize: 10});
  31 + const {
  32 + list: contractTypesList,
  33 + } = usePagination<API.TypesItem>(API.getContractTypes, {current: 1, pageSize: 999});
  34 + /**
  35 + * @description: 删除
  36 + * @param {*}
  37 + * @return {*}
  38 + *
  39 + */
  40 + const _delete = (row:API.Item) => {
  41 + const {id} =row;
  42 + API.delContractAuth({contractAuthId: id})
  43 + .then((res) => {
  44 + message.success("操作成功");
  45 + setParams({ ...innerParams }, true);
  46 + })
  47 + .catch((e) => {
  48 + message.error(e.message);
  49 + });
  50 + };
  51 +
  52 + /**
  53 + * @description: 编辑
  54 + * @param {API} row
  55 + * @return {*}
  56 + */
  57 + const edit = async (row:API.Item) => {
  58 + await setRow(row);
  59 + setVisible(true);
  60 + };
  61 +
  62 + /**
  63 + * @description: 禁用启用
  64 + * @param {API} row
  65 + * @return {*}
  66 + */
  67 + const handleDisable = (row:API.Item) => {
  68 + const { id, enabled } = row;
  69 + API.disableContractAuth({contractAuthId: id, enabled: !enabled})
  70 + .then((res) => {
  71 + message.success("操作成功");
  72 + setParams({ ...innerParams }, true);
  73 + })
  74 + .catch((err) => {
  75 + message.error(err.message);
  76 + });
  77 + };
  78 +
  79 + const showRoles = async (row:API.Item) => {
  80 + const {roles} = row;
  81 + try {
  82 + await setRoles(roles);
  83 + } finally {
  84 + setRolesVisible(true);
  85 + }
  86 + };
  87 +
  88 + return (
  89 + <PageHeaderWrapper title="合同授权">
  90 + <ConfigProvider locale={zhCN}>
  91 + <Card className={st.page}>
  92 + <div className={st.header}>
  93 + <Filter
  94 + contractTypesList={contractTypesList}
  95 + setParams={setParams}
  96 + innerParams={innerParams}
  97 + />
  98 + <Button
  99 + type="primary"
  100 + icon={<PlusOutlined />}
  101 + onClick={() => {
  102 + setVisible(true);
  103 + }}
  104 + >
  105 + 新增
  106 + </Button>
  107 + </div>
  108 + <Table
  109 + size="middle"
  110 + loading={loading}
  111 + dataSource={authList}
  112 + pagination={{ ...paginationConfig }}
  113 + scroll={{ y: 800 }}
  114 + rowKey={(item: API.Item) => `${item.id}`}
  115 + onChange={(_pagination) => setParams({ ..._pagination }, true)}
  116 + >
  117 + <Column title="合同类型" width={200} dataIndex="typeName" render={(t) => t || "-"} />
  118 + <Column
  119 + title="授权角色"
  120 + width={200}
  121 + dataIndex="id"
  122 + render={(text, row:API.Item) => (
  123 + <Button
  124 + type="link"
  125 + onClick={() => showRoles(row)}
  126 + >
  127 + 查看
  128 + </Button>
  129 + )}
  130 + />
  131 + <Column title="状态" width={200} dataIndex="enabled" render={(t) => (t?'启用':'禁用')} />
  132 + {/* <Column title="创建时间" width={200} dataIndex="createTime" render={(t) => (t ? moment(t).format('YYYY-MM-DD HH:mm') : "-")} />
  133 + <Column title="更新时间" width={200} dataIndex="updateTime" render={(t) => (t ? moment(t).format('YYYY-MM-DD HH:mm') : "-")} /> */}
  134 + <Column
  135 + title="操作"
  136 + width={100}
  137 + dataIndex="unit"
  138 + render={(text, row:API.Item) => (
  139 + <span>
  140 + <Popconfirm title={`是否${row.enabled ? "禁用?":"启用?"}`} onConfirm={() => handleDisable(row)} okText="确定" cancelText="取消">
  141 + <a
  142 + onClick={(e) => {
  143 + e.preventDefault();
  144 + }}
  145 + style={{ color: "#FAAD14" }}
  146 + >
  147 + {`${row.enabled ? '禁用' :'启用'}`}
  148 + </a>
  149 + </Popconfirm>
  150 + <Divider type="vertical" />
  151 + <Popconfirm title="是否编辑?" onConfirm={() => edit(row)} okText="确定" cancelText="取消">
  152 + <a
  153 + onClick={(e) => {
  154 + e.preventDefault();
  155 + }}
  156 + style={{ color: "#FAAD14" }}
  157 + >
  158 + 编辑
  159 + </a>
  160 + </Popconfirm>
  161 + <Divider type="vertical" />
  162 + <Popconfirm title="是否删除?" onConfirm={() => _delete(row)} okText="确定" cancelText="取消">
  163 + <a
  164 + onClick={(e) => {
  165 + e.preventDefault();
  166 + }}
  167 + style={{ color: "red" }}
  168 + >
  169 + 删除
  170 + </a>
  171 + </Popconfirm>
  172 + </span>
  173 +
  174 + )}
  175 + />
  176 + </Table>
  177 + <AddModel
  178 + visible={visible}
  179 + contractTypesList={contractTypesList}
  180 + roleList={roleList}
  181 + row={row}
  182 + onCancel={() => {
  183 + setVisible(false);
  184 + setRow(undefined);
  185 + }}
  186 + onRefresh={() => setParams({ ...innerParams }, true)}
  187 + />
  188 + <RolesModel
  189 + visible={rolesVisible}
  190 + roles={roles}
  191 + onCancel={() => {
  192 + setRolesVisible(false);
  193 + setRoles(undefined);
  194 + }}
  195 + onRefresh={() => setParams({ ...innerParams }, true)}
  196 + />
  197 + </Card>
  198 + </ConfigProvider>
  199 + </PageHeaderWrapper>
  200 + );
  201 +}
  202 +export default AuthorizationSetting;
src/pages/contract/AuthorizationSetting/style.css 0 → 100644
  1 +.page {
  2 + position: relative;
  3 +}
  4 +.page .header {
  5 + margin-bottom: 10px;
  6 + height: 32px;
  7 + display: flex;
  8 + flex-direction: row;
  9 + justify-content: space-between;
  10 +}
  11 +.page .header .add {
  12 + position: absolute;
  13 + right: 28px;
  14 + top: 24px;
  15 + z-index: 10;
  16 +}
  17 +.table :global .ant-table table {
  18 + width: 100%;
  19 + border-collapse: collapse;
  20 + text-align: center;
  21 + border-radius: 4px 4px 0 0;
  22 +}
  23 +.table :global .ant-table-thead > tr > th,
  24 +.table :global .ant-table-tbody > tr > td {
  25 + padding: 16px 16px;
  26 + word-break: break-word;
  27 + text-align: center;
  28 + -ms-word-break: break-all;
  29 +}
  30 +.table .cover {
  31 + align-items: center;
  32 + height: 68px;
  33 +}
  34 +.table .cover img {
  35 + border-radius: 4%;
  36 + height: 100%;
  37 + width: auto;
  38 + min-width: 100px;
  39 + max-width: 100px;
  40 +}
src/pages/contract/AuthorizationSetting/style.less 0 → 100644
  1 +//@import '~antd/lib/style/themes/default.less';
  2 +
  3 +.page {
  4 + position: relative;
  5 +
  6 + .header {
  7 + margin-bottom: 10px;
  8 + height: 32px;
  9 + display: flex;
  10 + flex-direction: row;
  11 + justify-content: space-between;
  12 + .add {
  13 + position: absolute;
  14 + right: 28px;
  15 + top: 24px;
  16 + z-index: 10;
  17 + }
  18 + }
  19 +
  20 + }
  21 + .table {
  22 + :global {
  23 + .ant-table table {
  24 + width: 100%;
  25 + border-collapse: collapse;
  26 + text-align: center;
  27 + border-radius: 4px 4px 0 0;
  28 + }
  29 + .ant-table-thead > tr > th, .ant-table-tbody > tr > td {
  30 + padding: 16px 16px;
  31 + word-break: break-word;
  32 + text-align: center;
  33 + -ms-word-break: break-all;
  34 + }
  35 + }
  36 + .cover {
  37 + align-items: center;
  38 + height: 68px;
  39 + img {
  40 + border-radius: 4%;
  41 + height: 100%;
  42 + width: auto;
  43 + min-width: 100px;
  44 + max-width: 100px;
  45 + }
  46 + }
  47 + }
  48 +
0 \ No newline at end of file 49 \ No newline at end of file
src/pages/contract/ExpressChargingStandardSetting/api.ts 0 → 100644
  1 +import { http } from "@/typing/http";
  2 +import request from "@/utils/request";
  3 +import qs from 'qs';
  4 +import { CONTRACT_HOST, HOST, FINANCE2_HOST } from "@/utils/host";
  5 +import { Any } from "currency.js";
  6 +
  7 +type PrResArr<T> = http.PromiseResp<T[]>;
  8 +
  9 +export interface PageParams {
  10 + current?: number;
  11 + pageSize?: number;
  12 + tradeCompId?:number; //合同类型名称
  13 + sendAreaNo?:string; //寄件地区编号
  14 + arriveAreaNo?:string; //到达地区编号
  15 +}
  16 +
  17 +export interface SaveParams {
  18 + expressChargeStandardId?:number; //id,提供该参数将执行编辑操作
  19 + tradeCompId:number; //往来单位id
  20 + tradeCompName:string; //往来单位名称
  21 + sendAreaNo:string; //寄件地区编号
  22 + sendAreaName:string; //寄件地区名称
  23 + firstWeight:number; //首重
  24 + continuedWeight:number; //续重
  25 + arriveAreas:ArriveAreas[]; //到达地区
  26 +}
  27 +
  28 +export interface DelParams {
  29 + expressChargeStandardId:number; //快递收费标准id
  30 +}
  31 +
  32 +export interface ArriveAreas {
  33 + arriveAreaNo:string; //到达地区编号
  34 + arriveAreaName:string; //到达地区名称
  35 +}
  36 +
  37 +export interface Item {
  38 + id?:number;
  39 + tradeCompName?:string; //往来单位名称
  40 + tradeCompShortName?:string; //往来单位简称
  41 + sendAreaName?:string; //寄件地区名称
  42 + arriveAreaName?:string; //到达地区名称
  43 + firstWeight?:number; //首重
  44 + continuedWeight?:number; //续重
  45 +}
  46 +
  47 +/**
  48 + * 分页查询快递收费标准
  49 + */
  50 + export function getStandardPage(params?: PageParams): http.PromisePageResp<Item> {
  51 + return request.get(`${CONTRACT_HOST}/erp/express/charge/standard/page`, { params });
  52 +}
  53 +
  54 +/**
  55 + * 新增/编辑快递收费标准
  56 + */
  57 + export function addStandardSave(params: SaveParams): http.PromiseResp<any> {
  58 + return request.post(`${CONTRACT_HOST}/erp/express/charge/standard/save`, { ...params });
  59 +}
  60 +
  61 +/**
  62 + * 删除快递收费标准
  63 + */
  64 + export function delStandard(params: DelParams): http.PromiseResp<void> {
  65 + return request.post(`${CONTRACT_HOST}/erp/express/charge/standard/delete`, { ...params });
  66 +}
  67 +
  68 +/**获取往来单位列表*/
  69 +export function fetchComps(params?: any): http.PromiseResp<BearCostSetting.Comp[]> {
  70 + return request.get(`${FINANCE2_HOST}/common/trade/company/list`, {params });
  71 +}
  72 +
  73 +/**
  74 + * 城市列表
  75 + */
  76 + export function getCityLsit(): http.PromiseResp<any> {
  77 + const params = { pbh: 0 };
  78 + return request.get(`/oop/select/region`, { params });
  79 +}
0 \ No newline at end of file 80 \ No newline at end of file
src/pages/contract/ExpressChargingStandardSetting/components/AddModel/index.tsx 0 → 100644
  1 +import React, { useCallback, useEffect, useState } from "react";
  2 +import { Modal, Skeleton, Select, Form, message, InputNumber } from "antd";
  3 +import * as API from '../../api';
  4 +import _ from "lodash";
  5 +
  6 +interface Props {
  7 + visible:boolean;
  8 + row?:API.Item;
  9 + compList:any[];
  10 + cityList:any[];
  11 + onCancel:()=>void;
  12 + onRefresh:() => void;
  13 +
  14 +}
  15 +
  16 +function AddModel({visible, row, compList, cityList, onCancel, onRefresh}:Props) {
  17 + const [form] = Form.useForm();
  18 + const [loading, setLoading] = useState<boolean>(false);
  19 + const { id } = row || {};
  20 + useEffect(() => {
  21 + if (id) {
  22 + const { tradeCompName, sendAreaName, firstWeight, continuedWeight, arriveAreaName } = row || {};
  23 + form.setFieldsValue({
  24 + tradeComp: compList.filter(it => tradeCompName === it.name).map(item => ({value: item.id, label: item.name}))[0],
  25 + sendArea: cityList.filter(it => sendAreaName === it.fullName).map(item => ({value: item.bh, label: item.fullName}))[0],
  26 + firstWeight,
  27 + continuedWeight,
  28 + arriveAreas: cityList.filter(it => arriveAreaName === it.fullName).map(item => ({value: item.bh, label: item.fullName}))[0]
  29 +
  30 + });
  31 + }
  32 + }, [row]);
  33 +
  34 + /**
  35 + * @description: 确定
  36 + * @param {*}
  37 + * @return {*}
  38 + */
  39 + const handleSave = (feildValue:any) => {
  40 + setLoading(true);
  41 + const {tradeComp, sendArea, arriveAreas, firstWeight, continuedWeight} = feildValue;
  42 + const _arriveAreas = id ? [{ ...arriveAreas }].map(item => ({arriveAreaNo: item.value, arriveAreaName: item.label}))
  43 + : arriveAreas.length && arriveAreas.map((item:any) => ({arriveAreaNo: item.value, arriveAreaName: item.label}));
  44 +
  45 + const params = {
  46 + expressChargeStandardId: id,
  47 + tradeCompId: tradeComp.value,
  48 + tradeCompName: tradeComp.label,
  49 + tradeCompShortName: compList && compList.filter(item => item.id == tradeComp.value)[0].shortName,
  50 + sendAreaNo: sendArea.value,
  51 + sendAreaName: sendArea.label,
  52 + firstWeight,
  53 + continuedWeight,
  54 + arriveAreas: _arriveAreas
  55 + };
  56 + API.addStandardSave({ ...params })
  57 + .then(res => {
  58 + message.success("操作成功");
  59 + _onCancel();
  60 + setLoading(false);
  61 + onRefresh();
  62 + }).catch(err => {
  63 + message.error(err?.message);
  64 + setLoading(false);
  65 + });
  66 + };
  67 + /**
  68 + * @description: 关闭弹框
  69 + * @param {*}
  70 + * @return {*}
  71 + */
  72 + const _onCancel = () => {
  73 + onCancel && onCancel();
  74 + form.resetFields();
  75 + };
  76 +
  77 + return (
  78 + <Modal
  79 + title={`${id ? '编辑':'新增'}快递收费标准`}
  80 + visible={visible}
  81 + confirmLoading={loading}
  82 + onCancel={_onCancel}
  83 + onOk={form.submit}
  84 + cancelButtonProps={{ hidden: true }}
  85 + width="50%"
  86 + bodyStyle={{minHeight: 300}}
  87 + >
  88 + <Skeleton loading={false}>
  89 + <Form form={form} onFinish={handleSave} wrapperCol={{ span: 18 }} labelCol={{ span: 4 }}>
  90 + <Form.Item
  91 + label="快递公司"
  92 + name="tradeComp"
  93 + rules={[{required: true, message: '请选择快递公司'}]}
  94 + >
  95 + <Select
  96 + placeholder="请选择快递公司"
  97 + showSearch
  98 + allowClear
  99 + optionFilterProp="children"
  100 + labelInValue
  101 + onSelect={(it:any) => {
  102 + const item = compList.filter((i:any) => it.value === i.id);
  103 + }}
  104 + filterOption={(input, option: any) => option?.children.indexOf(input) >= 0}
  105 + >
  106 + {
  107 + compList.map(item => (
  108 + <Select.Option value={item.id} key={item.id}>
  109 + {item.name}
  110 + </Select.Option>
  111 + ))
  112 + }
  113 + </Select>
  114 + </Form.Item>
  115 + <Form.Item
  116 + label="寄件地区"
  117 + name="sendArea"
  118 + rules={[{required: true, message: '请选择寄件地区'}]}
  119 + >
  120 + <Select
  121 + placeholder="请选择寄件地区"
  122 + showSearch
  123 + allowClear
  124 + optionFilterProp="children"
  125 + labelInValue
  126 + onSelect={(it:any) => {
  127 + const item = cityList.filter((i:any) => it.value === i.id);
  128 + }}
  129 + filterOption={(input, option: any) => option?.children.indexOf(input) >= 0}
  130 + >
  131 + {
  132 + cityList.map(item => (
  133 + <Select.Option value={item.bh} key={item.bh}>
  134 + {item.fullName}
  135 + </Select.Option>
  136 + ))
  137 + }
  138 + </Select>
  139 + </Form.Item>
  140 + <Form.Item
  141 + label="到达地区"
  142 + name="arriveAreas"
  143 + rules={[{required: true, message: '请选择到达地区'}]}
  144 + >
  145 + <Select
  146 + placeholder={`请选择到达地区${id ? '' : '(支持多选)'}`}
  147 + mode={id ? undefined : 'multiple'}
  148 + showSearch
  149 + allowClear
  150 + showArrow
  151 + optionFilterProp="children"
  152 + labelInValue
  153 + onSelect={(it:any) => {
  154 + const item = cityList.filter((i:any) => it.value === i.id);
  155 + }}
  156 + filterOption={(input, option: any) => option?.children.indexOf(input) >= 0}
  157 + >
  158 + {
  159 + cityList.map(item => (
  160 + <Select.Option value={item.bh} key={item.bh}>
  161 + {item.fullName}
  162 + </Select.Option>
  163 + ))
  164 + }
  165 + </Select>
  166 + </Form.Item>
  167 + <Form.Item
  168 + label="首重"
  169 + name="firstWeight"
  170 + rules={[{required: true, message: '请填写首重'}]}
  171 + >
  172 + <InputNumber placeholder="请填写" addonAfter="元" max={100000000} min={0} precision={2} />
  173 + </Form.Item>
  174 + <Form.Item
  175 + label="续重"
  176 + name="continuedWeight"
  177 + rules={[{required: true, message: '请填写续重'}]}
  178 + >
  179 + <InputNumber placeholder="请填写" addonAfter="元/kg" max={100000000} min={0} precision={2} />
  180 + </Form.Item>
  181 + </Form>
  182 + </Skeleton>
  183 + </Modal>
  184 + );
  185 +}
  186 +
  187 +export default AddModel;
0 \ No newline at end of file 188 \ No newline at end of file
src/pages/contract/ExpressChargingStandardSetting/components/Filter/index.tsx 0 → 100644
  1 +import React, { useCallback, useState } from "react";
  2 +import { Row, Col, Select } from "antd";
  3 +import _ from "lodash";
  4 +
  5 +interface Props {
  6 + setParams:any;
  7 + innerParams:any;
  8 + cityList:any[];
  9 + compList:BearCostSetting.Comp[];
  10 +}
  11 +
  12 +interface SearchData {
  13 + tradeCompId?:number;//往来单位id
  14 + sendAreaNo?:string;//寄件地区编号
  15 + arriveAreaNo?:string;//到达地区编号
  16 +}
  17 +
  18 +function Filter({ compList, cityList, setParams, innerParams }:Props) {
  19 + const [searchData, setSearchData] = useState<SearchData>({});
  20 + return (
  21 + <Row style={{flex: 1}}>
  22 + <Col span={8} style={{marginRight: 10}}>
  23 + <Select
  24 + placeholder="请选择快递公司"
  25 + showSearch
  26 + optionFilterProp="children"
  27 + allowClear
  28 + style={{ minWidth: 260, maxWidth: 280 }}
  29 + onChange={(tradeCompId) => {
  30 + setSearchData({...searchData, tradeCompId});
  31 + setParams({...innerParams, ...searchData, tradeCompId}, true);
  32 + }}
  33 + >
  34 + {
  35 + compList.map(item => (
  36 + <Select.Option value={item.id} key={item.id}>
  37 + {item.name}
  38 + </Select.Option>
  39 + ))
  40 + }
  41 + </Select>
  42 + </Col>
  43 + <Col span={6} style={{marginRight: 10}}>
  44 + <Select
  45 + placeholder="请选择寄件地区"
  46 + showSearch
  47 + optionFilterProp="children"
  48 + allowClear
  49 + style={{ width: 200 }}
  50 + onChange={(sendAreaNo) => {
  51 + setSearchData({...searchData, sendAreaNo});
  52 + setParams({...innerParams, ...searchData, sendAreaNo}, true);
  53 + }}
  54 + >
  55 + {
  56 + cityList.map(item => (
  57 + <Select.Option value={item.bh} key={item.bh}>
  58 + {item.fullName}
  59 + </Select.Option>
  60 + ))
  61 + }
  62 + </Select>
  63 + </Col>
  64 + <Col span={6} style={{marginRight: 10}}>
  65 + <Select
  66 + placeholder="请选择到达地区"
  67 + showSearch
  68 + optionFilterProp="children"
  69 + allowClear
  70 + style={{ width: 200 }}
  71 + onChange={(arriveAreaNo) => {
  72 + setSearchData({...searchData, arriveAreaNo});
  73 + setParams({...innerParams, ...searchData, arriveAreaNo}, true);
  74 + }}
  75 + >
  76 + {
  77 + cityList.map(item => (
  78 + <Select.Option value={item.bh} key={item.bh}>
  79 + {item.fullName}
  80 + </Select.Option>
  81 + ))
  82 + }
  83 + </Select>
  84 + </Col>
  85 + </Row>
  86 + );
  87 +}
  88 +
  89 +export default Filter;
0 \ No newline at end of file 90 \ No newline at end of file
src/pages/contract/ExpressChargingStandardSetting/index.tsx 0 → 100644
  1 +import React, { useState } from "react";
  2 +import { Button, Card, ConfigProvider, Divider, message, Popconfirm, Table } from "antd";
  3 +import { PageHeaderWrapper } from "@ant-design/pro-layout";
  4 +import zhCN from "antd/lib/locale-provider/zh_CN";
  5 +import usePagination from "@/hooks/usePagination";
  6 +import useInitial from "@/hooks/useInitail";
  7 +import { PlusOutlined } from "@ant-design/icons";
  8 +import AddModel from './components/AddModel';
  9 +import Filter from './components/Filter';
  10 +import * as API from './api';
  11 +import _ from "lodash";
  12 +import st from "./style.less";
  13 +
  14 +interface Props {
  15 +}
  16 +
  17 +const { Column } = Table;
  18 +
  19 +function expressChargingStandard(props:Props) {
  20 + const [visible, setVisible] = useState<boolean>(false);
  21 + const {
  22 + list: standardList,
  23 + loading,
  24 + paginationConfig,
  25 + innerParams,
  26 + setParams,
  27 + setLoading
  28 + } = usePagination<API.Item>(API.getStandardPage, {current: 1, pageSize: 10});
  29 + const { data: cityList, loading: cityLoading } = useInitial(API.getCityLsit, [], {});
  30 + const { data: compList, loading: compLoading } = useInitial(API.fetchComps, [], {types: '88'});
  31 + const [row, setRow] = useState<API.Item>();
  32 + /**
  33 + * @description: 编辑
  34 + * @param {*} _
  35 + * @return {*}
  36 + */
  37 + const edit = _.debounce(async (row:API.Item) => {
  38 + await setRow({...row});
  39 + setVisible(true);
  40 + }, 800);
  41 +
  42 + /**
  43 + * @description: 删除
  44 + * @param {*} _
  45 + * @return {*}
  46 + */
  47 + const _delete = _.debounce((row:API.Item) => {
  48 + const {id} = row;
  49 + if (!id) return;
  50 + setLoading(true);
  51 + API.delStandard({expressChargeStandardId: id})
  52 + .then(res => {
  53 + message.success("操作成功");
  54 + setParams({...innerParams}, true);
  55 + setLoading(false);
  56 + }).catch(err => {
  57 + message.error(err?.message);
  58 + setLoading(false);
  59 + });
  60 + }, 800);
  61 +
  62 + return (
  63 + <PageHeaderWrapper
  64 + loading={cityLoading || compLoading}
  65 + title="快递收费标准配置"
  66 + >
  67 + <ConfigProvider locale={zhCN}>
  68 + <Card className={st.page}>
  69 + <div className={st.header}>
  70 + <Filter
  71 + cityList={cityList || []}
  72 + compList={compList || []}
  73 + setParams={setParams}
  74 + innerParams={innerParams}
  75 + />
  76 + <Button
  77 + type="primary"
  78 + icon={<PlusOutlined />}
  79 + onClick={() => {
  80 + setVisible(true);
  81 + }}
  82 + >
  83 + 新增
  84 + </Button>
  85 + </div>
  86 + <Table
  87 + size="middle"
  88 + loading={loading}
  89 + dataSource={standardList}
  90 + pagination={{ ...paginationConfig }}
  91 + scroll={{ y: 800 }}
  92 + rowKey={(item: API.Item) => `${item.id}`}
  93 + onChange={(_pagination) => setParams({ ..._pagination }, true)}
  94 + >
  95 + <Column title="快递公司" width={200} dataIndex="tradeCompName" render={(t:any) => t || "-"} />
  96 + <Column title="寄件地区" width={200} dataIndex="sendAreaName" render={(t:any) => t || '-'} />
  97 + <Column title="到达地区" width={200} dataIndex="arriveAreaName" render={(t:any) => t || '-'} />
  98 + <Column title="首重(元)" width={200} dataIndex="firstWeight" render={(t:any) => t || '-'} />
  99 + <Column title="续重(元/kg)" width={200} dataIndex="continuedWeight" render={(t:any) => t || '-'} />
  100 + <Column
  101 + title="操作"
  102 + width={100}
  103 + dataIndex="unit"
  104 + render={(text, row:API.Item) => (
  105 + <span>
  106 + <Popconfirm title="是否编辑?" onConfirm={() => edit(row)} okText="确定" cancelText="取消">
  107 + <a
  108 + onClick={(e) => {
  109 + e.preventDefault();
  110 + }}
  111 + style={{ color: "#FAAD14" }}
  112 + >
  113 + 编辑
  114 + </a>
  115 + </Popconfirm>
  116 + <Divider type="vertical" />
  117 + <Popconfirm title="是否删除?" onConfirm={() => _delete(row)} okText="确定" cancelText="取消">
  118 + <a
  119 + onClick={(e) => {
  120 + e.preventDefault();
  121 + }}
  122 + style={{ color: "red" }}
  123 + >
  124 + 删除
  125 + </a>
  126 + </Popconfirm>
  127 + </span>
  128 +
  129 + )}
  130 + />
  131 + </Table>
  132 + <AddModel
  133 + visible={visible}
  134 + row={row}
  135 + compList={compList || []}
  136 + cityList={cityList || []}
  137 + onCancel={() => {
  138 + setVisible(false);
  139 + setRow(undefined);
  140 + }}
  141 + onRefresh={() => setParams({ ...innerParams }, true)}
  142 + />
  143 + </Card>
  144 + </ConfigProvider>
  145 + </PageHeaderWrapper>
  146 + );
  147 +}
  148 +
  149 +export default expressChargingStandard;
0 \ No newline at end of file 150 \ No newline at end of file
src/pages/contract/ExpressChargingStandardSetting/style.less 0 → 100644
  1 +//@import '~antd/lib/style/themes/default.less';
  2 +
  3 +.page {
  4 + position: relative;
  5 +
  6 + .header {
  7 + margin-bottom: 10px;
  8 + height: 32px;
  9 + display: flex;
  10 + flex-direction: row;
  11 + justify-content: space-between;
  12 + .add {
  13 + position: absolute;
  14 + right: 28px;
  15 + top: 24px;
  16 + z-index: 10;
  17 + }
  18 + }
  19 +
  20 + }
  21 + .table {
  22 + :global {
  23 + .ant-table table {
  24 + width: 100%;
  25 + border-collapse: collapse;
  26 + text-align: center;
  27 + border-radius: 4px 4px 0 0;
  28 + }
  29 + .ant-table-thead > tr > th, .ant-table-tbody > tr > td {
  30 + padding: 16px 16px;
  31 + word-break: break-word;
  32 + text-align: center;
  33 + -ms-word-break: break-all;
  34 + }
  35 + }
  36 + .cover {
  37 + align-items: center;
  38 + height: 68px;
  39 + img {
  40 + border-radius: 4%;
  41 + height: 100%;
  42 + width: auto;
  43 + min-width: 100px;
  44 + max-width: 100px;
  45 + }
  46 + }
  47 + }
  48 +
0 \ No newline at end of file 49 \ No newline at end of file
src/pages/performance/EvaDataImport/EditComfirm/index.tsx
@@ -25,7 +25,7 @@ function Index(props: Props) { @@ -25,7 +25,7 @@ function Index(props: Props) {
25 const [delay, setDelay] = useState(true); 25 const [delay, setDelay] = useState(true);
26 const [newData, setNewData] = useState<any>([]); 26 const [newData, setNewData] = useState<any>([]);
27 const { match } = props; 27 const { match } = props;
28 - const { id } = match.params; 28 + const { id, num } = match.params;
29 useEffect(() => { 29 useEffect(() => {
30 setId(id); 30 setId(id);
31 }, [id]); 31 }, [id]);
@@ -35,6 +35,7 @@ function Index(props: Props) { @@ -35,6 +35,7 @@ function Index(props: Props) {
35 setDelay(false); 35 setDelay(false);
36 } 36 }
37 }, [configId]); 37 }, [configId]);
  38 + console.log('num', num);
38 const { data, errMsg, setParams, loading } = useInitail(evaDataDetailApi, {}, {}, delay); 39 const { data, errMsg, setParams, loading } = useInitail(evaDataDetailApi, {}, {}, delay);
39 console.log(isArray(data)); 40 console.log(isArray(data));
40 useEffect(() => { 41 useEffect(() => {
@@ -46,7 +47,7 @@ function Index(props: Props) { @@ -46,7 +47,7 @@ function Index(props: Props) {
46 return ( 47 return (
47 <PageHeaderWrapper title="考评数据导入"> 48 <PageHeaderWrapper title="考评数据导入">
48 <Card> 49 <Card>
49 - <Table loading={loading} rowKey={(row) => `id${id}`} dataSource={newData}> 50 + <Table loading={loading} rowKey={(row) => `id${id}`} dataSource={newData} pagination={{ total: num }}>
50 <Column title="归属人员" dataIndex="userName" align="center" render={(name) => <span>{name || "--"}</span>} /> 51 <Column title="归属人员" dataIndex="userName" align="center" render={(name) => <span>{name || "--"}</span>} />
51 <Column title="归属门店" dataIndex="shopName" align="center" render={(name) => <span>{name || "--"}</span>} /> 52 <Column title="归属门店" dataIndex="shopName" align="center" render={(name) => <span>{name || "--"}</span>} />
52 <Column 53 <Column
@@ -80,7 +81,9 @@ function Index(props: Props) { @@ -80,7 +81,9 @@ function Index(props: Props) {
80 title="是否导入" 81 title="是否导入"
81 dataIndex="errorType" 82 dataIndex="errorType"
82 align="center" 83 align="center"
83 - render={(_: any, record: any) => (record.errorType ? <div className={st.no}>未导入</div> : <div className={st.yes}>已导入</div>)} 84 + render={(_: any, record: any) =>
  85 + record.errorType ? <div className={st.no}>未导入</div> : <div className={st.yes}>已导入</div>
  86 + }
84 /> 87 />
85 <Column 88 <Column
86 title="未导入原因" 89 title="未导入原因"
src/pages/performance/EvaDataImport/api.ts
@@ -44,3 +44,11 @@ export function evaDataDetailApi(params: { id: number }): http.PromisePageResp&lt;a @@ -44,3 +44,11 @@ export function evaDataDetailApi(params: { id: number }): http.PromisePageResp&lt;a
44 export function evaDataIndApi(): http.PromiseResp<any> { 44 export function evaDataIndApi(): http.PromiseResp<any> {
45 return request.get(`${MORAX_HOST}/erp/eval-indicator/indicators`, {}); 45 return request.get(`${MORAX_HOST}/erp/eval-indicator/indicators`, {});
46 } 46 }
  47 +
  48 +/**
  49 + * 保存上传人员数据
  50 + * http://testgate.feewee.cn/morax/erp/eval-indicator/save-import
  51 + */
  52 +export function saveEvaImportData(params: { key: string }) {
  53 + return request.get(`${MORAX_HOST}/erp/eval-indicator/save-import`, { params });
  54 +}
src/pages/performance/EvaDataImport/components/FileDatailsModal.tsx
@@ -19,6 +19,7 @@ import { TargetType, TargetTypeEnum } from &quot;@/pages/performance/entity&quot;; @@ -19,6 +19,7 @@ import { TargetType, TargetTypeEnum } from &quot;@/pages/performance/entity&quot;;
19 import { render } from "react-dom"; 19 import { render } from "react-dom";
20 import moment from "moment"; 20 import moment from "moment";
21 import { ReasonsEnum } from "../entity"; 21 import { ReasonsEnum } from "../entity";
  22 +import { saveEvaImportData } from "../api";
22 import { history } from "umi"; 23 import { history } from "umi";
23 import st from "./style.less"; 24 import st from "./style.less";
24 25
@@ -28,28 +29,40 @@ interface Props { @@ -28,28 +29,40 @@ interface Props {
28 visible: boolean; 29 visible: boolean;
29 fileData: any; 30 fileData: any;
30 tarOnCancel: Function; 31 tarOnCancel: Function;
  32 + setParams: Function;
  33 + innerParams: any;
31 } 34 }
32 -const columns = [  
33 - {  
34 - title: "目标名称",  
35 - dataIndex: "indicatorName",  
36 - key: "indicatorName",  
37 - },  
38 -  
39 - {  
40 - title: "目标值",  
41 - dataIndex: "targetValue",  
42 - key: "targetValue",  
43 - render: (value: Number, record: any) => {  
44 - return record.targetType === 2 ? `${value}%` : record.targetType === 3 ? `${value}元` : `${value}台`;  
45 - },  
46 - },  
47 -];  
48 -const TargetModal = ({ visible, fileData, tarOnCancel }: Props) => { 35 +const TargetModal = ({ visible, fileData, tarOnCancel, setParams, innerParams }: Props) => {
  36 + const [loading, setLoading] = useState<boolean>(false);
  37 + const onOk = async (key: string) => {
  38 + const pa = { key };
  39 + setLoading(true);
  40 + try {
  41 + const { success } = await saveEvaImportData(pa);
  42 + if (success) {
  43 + setLoading(false);
  44 + message.success(`数据上传成功`, 5);
  45 + // 重新刷新列表
  46 + setParams({ ...innerParams }, true);
  47 + tarOnCancel && tarOnCancel();
  48 + }
  49 + } catch (error: any) {
  50 + setLoading(false);
  51 + message.error(error.message);
  52 + }
  53 + };
49 return ( 54 return (
50 <> 55 <>
51 - <Modal title="导入数据详情" visible={visible} onCancel={() => tarOnCancel()} maskClosable={false} width={1500}>  
52 - <Table bordered dataSource={fileData.details}> 56 + <Modal
  57 + title="导入数据详情"
  58 + visible={visible}
  59 + onCancel={() => tarOnCancel()}
  60 + maskClosable={false}
  61 + width={1500}
  62 + onOk={() => onOk(fileData.key)}
  63 + confirmLoading={loading}
  64 + >
  65 + <Table bordered dataSource={fileData.details} pagination={{ total: fileData.num }}>
53 <Column title="归属人员" dataIndex="userName" align="center" render={(name) => <span>{name || "--"}</span>} /> 66 <Column title="归属人员" dataIndex="userName" align="center" render={(name) => <span>{name || "--"}</span>} />
54 <Column title="归属门店" dataIndex="shopName" align="center" render={(name) => <span>{name || "--"}</span>} /> 67 <Column title="归属门店" dataIndex="shopName" align="center" render={(name) => <span>{name || "--"}</span>} />
55 <Column 68 <Column
@@ -58,7 +71,7 @@ const TargetModal = ({ visible, fileData, tarOnCancel }: Props) =&gt; { @@ -58,7 +71,7 @@ const TargetModal = ({ visible, fileData, tarOnCancel }: Props) =&gt; {
58 align="center" 71 align="center"
59 render={(name) => <span>{name || "--"}</span>} 72 render={(name) => <span>{name || "--"}</span>}
60 /> 73 />
61 - <Column 74 + {/* <Column
62 title="指标值" 75 title="指标值"
63 dataIndex="indicatorValue" 76 dataIndex="indicatorValue"
64 align="center" 77 align="center"
@@ -71,7 +84,7 @@ const TargetModal = ({ visible, fileData, tarOnCancel }: Props) =&gt; { @@ -71,7 +84,7 @@ const TargetModal = ({ visible, fileData, tarOnCancel }: Props) =&gt; {
71 : "--"} 84 : "--"}
72 </span> 85 </span>
73 )} 86 )}
74 - /> 87 + /> */}
75 <Column 88 <Column
76 title="考核周期" 89 title="考核周期"
77 dataIndex="dataDate" 90 dataIndex="dataDate"
@@ -93,6 +106,12 @@ const TargetModal = ({ visible, fileData, tarOnCancel }: Props) =&gt; { @@ -93,6 +106,12 @@ const TargetModal = ({ visible, fileData, tarOnCancel }: Props) =&gt; {
93 render={(_: any, record: any) => (record.errorType ? ReasonsEnum[record.errorType] : "--")} 106 render={(_: any, record: any) => (record.errorType ? ReasonsEnum[record.errorType] : "--")}
94 /> 107 />
95 </Table> 108 </Table>
  109 + <div>
  110 + 成功条数: <span style={{ color: "#20c688" }}>{fileData.successNum}</span> 条
  111 + </div>
  112 + <div>
  113 + 失败条数: <span style={{ color: "#f4333c" }}>{fileData.errorNum}</span> 条
  114 + </div>
96 </Modal> 115 </Modal>
97 </> 116 </>
98 ); 117 );
src/pages/performance/EvaDataImport/index.tsx
@@ -20,7 +20,7 @@ export default () =&gt; { @@ -20,7 +20,7 @@ export default () =&gt; {
20 const [visible, setVisible] = useState<boolean>(false); 20 const [visible, setVisible] = useState<boolean>(false);
21 const uploadPerson: UploadProps = { 21 const uploadPerson: UploadProps = {
22 name: "file", 22 name: "file",
23 - action: "/api/morax/erp/eval-indicator/staff-indicator", 23 + action: "/api/morax/erp/eval-indicator/analysis-staff",
24 maxCount: 1, 24 maxCount: 1,
25 showUploadList: false, 25 showUploadList: false,
26 onChange(info) { 26 onChange(info) {
@@ -28,10 +28,8 @@ export default () =&gt; { @@ -28,10 +28,8 @@ export default () =&gt; {
28 console.log(info.file, info.fileList); 28 console.log(info.file, info.fileList);
29 } 29 }
30 if (info.file.status === "done") { 30 if (info.file.status === "done") {
31 - message.success(`${info.file.name} 上传成功`);  
32 - setParams({ ...innerParams }, true);  
33 - // setFileData(info.file.response.data);  
34 - // setVisible(true); 31 + setFileData(info.file.response.data);
  32 + setVisible(true);
35 } else if (info.file.status === "error") { 33 } else if (info.file.status === "error") {
36 message.error(`${info.file.name} 上传失败`); 34 message.error(`${info.file.name} 上传失败`);
37 } 35 }
@@ -39,7 +37,7 @@ export default () =&gt; { @@ -39,7 +37,7 @@ export default () =&gt; {
39 }; 37 };
40 const uploadShop: UploadProps = { 38 const uploadShop: UploadProps = {
41 name: "file", 39 name: "file",
42 - action: "/api/morax/erp/eval-indicator/shop-indicator", 40 + action: "/api/morax/erp/eval-indicator/analysis-shop",
43 maxCount: 1, 41 maxCount: 1,
44 showUploadList: false, 42 showUploadList: false,
45 onChange(info) { 43 onChange(info) {
@@ -47,8 +45,8 @@ export default () =&gt; { @@ -47,8 +45,8 @@ export default () =&gt; {
47 console.log(info.file, info.fileList); 45 console.log(info.file, info.fileList);
48 } 46 }
49 if (info.file.status === "done") { 47 if (info.file.status === "done") {
50 - message.success(`${info.file.name} 上传成功`);  
51 - setParams({ ...innerParams }, true); 48 + setFileData(info.file.response.data);
  49 + setVisible(true);
52 } else if (info.file.status === "error") { 50 } else if (info.file.status === "error") {
53 message.error(`${info.file.name} 上传失败`); 51 message.error(`${info.file.name} 上传失败`);
54 } 52 }
@@ -91,7 +89,7 @@ export default () =&gt; { @@ -91,7 +89,7 @@ export default () =&gt; {
91 </Row> 89 </Row>
92 <Table 90 <Table
93 loading={loading} 91 loading={loading}
94 - rowKey={(row) => `id${row.indicatorCode}`} 92 + rowKey={(row) => `id${row.id}`}
95 dataSource={list} 93 dataSource={list}
96 pagination={paginationConfig} 94 pagination={paginationConfig}
97 > 95 >
@@ -136,11 +134,11 @@ export default () =&gt; { @@ -136,11 +134,11 @@ export default () =&gt; {
136 align="center" 134 align="center"
137 dataIndex="enable" 135 dataIndex="enable"
138 width={150} 136 width={150}
139 - render={(text: boolean, record: KpiSetteing.KpiListItems) => ( 137 + render={(text: boolean, record: any) => (
140 <Space split={<Divider type="vertical" />}> 138 <Space split={<Divider type="vertical" />}>
141 <Typography.Link 139 <Typography.Link
142 onClick={() => { 140 onClick={() => {
143 - history.push(`/morax/evaDataImport/edit/${record.id}`); 141 + history.push(`/morax/evaDataImport/edit/${record.id}/${record.num}`);
144 }} 142 }}
145 > 143 >
146 查看 144 查看
@@ -149,7 +147,13 @@ export default () =&gt; { @@ -149,7 +147,13 @@ export default () =&gt; {
149 )} 147 )}
150 /> 148 />
151 </Table> 149 </Table>
152 - {/* <FileDatailsModal visible={visible} tarOnCancel={() => setVisible(false)} fileData={fileData} /> */} 150 + <FileDatailsModal
  151 + visible={visible}
  152 + tarOnCancel={() => setVisible(false)}
  153 + fileData={fileData}
  154 + setParams={setParams}
  155 + innerParams={innerParams}
  156 + />
153 </Card> 157 </Card>
154 </PageHeaderWrapper> 158 </PageHeaderWrapper>
155 ); 159 );
src/pages/performance/EvaGroupSetting/EditComfirm/components/AddEvaGroupModal.tsx
@@ -76,10 +76,10 @@ export default function AddIndicatorsModal(props: Props) { @@ -76,10 +76,10 @@ export default function AddIndicatorsModal(props: Props) {
76 76
77 // 查询门店 77 // 查询门店
78 useEffect(() => { 78 useEffect(() => {
79 - if (evaItem.postId) {  
80 - getDealerList(evaItem.postId); 79 + if (evaItem.post) {
  80 + getDealerList(evaItem.post.value);
81 } 81 }
82 - }, [evaItem.postId]); 82 + }, [evaItem]);
83 console.log("shopList", shopList); 83 console.log("shopList", shopList);
84 84
85 // 查询管理角色 85 // 查询管理角色
@@ -256,11 +256,28 @@ export default function AddIndicatorsModal(props: Props) { @@ -256,11 +256,28 @@ export default function AddIndicatorsModal(props: Props) {
256 } 256 }
257 </Form.Item> 257 </Form.Item>
258 258
259 - <Form.Item name="indicators" label="考评指标" rules={[{ required: true }]}>  
260 - <IndivatorsTable postId={postId} personModal={personModal} scopeType={scopeType} /> 259 + <Form.Item noStyle shouldUpdate={(prevValues, currentValues) => prevValues.rewards !== currentValues.rewards}>
  260 + {({ getFieldValue }) => {
  261 + const rewards = getFieldValue("rewards");
  262 + return (
  263 + <Form.Item name="indicators" label="考评指标" rules={[{ required: !(rewards && rewards.length > 0) }]}>
  264 + <IndivatorsTable postId={postId} personModal={personModal} scopeType={scopeType} />
  265 + </Form.Item>
  266 + );
  267 + }}
261 </Form.Item> 268 </Form.Item>
262 - <Form.Item name="rewards" label="考评奖惩" rules={[{ required: true }]}>  
263 - <RewardsTableSal postId={postId} personModal={personModal} scopeType={scopeType} /> 269 + <Form.Item
  270 + noStyle
  271 + shouldUpdate={(prevValues, currentValues) => prevValues.indicators !== currentValues.indicators}
  272 + >
  273 + {({ getFieldValue }) => {
  274 + const indicators = getFieldValue("indicators");
  275 + return (
  276 + <Form.Item name="rewards" label="考评奖惩" rules={[{ required: !(indicators && indicators.length > 0) }]}>
  277 + <RewardsTableSal postId={postId} personModal={personModal} scopeType={scopeType} />
  278 + </Form.Item>
  279 + );
  280 + }}
264 </Form.Item> 281 </Form.Item>
265 </Form> 282 </Form>
266 283
src/pages/performance/EvaGroupSetting/EditComfirm/components/RankModal.tsx
@@ -60,8 +60,13 @@ const TotalAmount = ({ @@ -60,8 +60,13 @@ const TotalAmount = ({
60 if (dataIndex == "upper" && isPercent == 2) { 60 if (dataIndex == "upper" && isPercent == 2) {
61 precision = 2; 61 precision = 2;
62 } 62 }
63 - const inputNode =  
64 - inputType === "number" ? <InputNumber precision={precision} max={isPercent == 2 ? 100 : 100000} /> : <Input />; 63 + let max = 0;
  64 + if ((dataIndex == "upper" || dataIndex == "lower") && isPercent == 2) {
  65 + max = 100;
  66 + } else {
  67 + max = 999999999999;
  68 + }
  69 + const inputNode = inputType === "number" ? <InputNumber precision={precision} max={max} /> : <Input />;
65 70
66 return ( 71 return (
67 <td {...restProps}> 72 <td {...restProps}>
src/pages/performance/EvaSetting/components/EditModal.tsx
@@ -98,7 +98,7 @@ export default function EditModal({ onClose, setItem, item, roleList }: Props) { @@ -98,7 +98,7 @@ export default function EditModal({ onClose, setItem, item, roleList }: Props) {
98 ))} 98 ))}
99 </Select> 99 </Select>
100 </Form.Item> 100 </Form.Item>
101 - <Form.Item name="belongSystem" label="归属系统" rules={[{ required: true }]}> 101 + {/* <Form.Item name="belongSystem" label="归属系统" rules={[{ required: true }]}>
102 <Select placeholder="请选择归属系统" showSearch allowClear labelInValue optionFilterProp="children"> 102 <Select placeholder="请选择归属系统" showSearch allowClear labelInValue optionFilterProp="children">
103 {list.map((item) => ( 103 {list.map((item) => (
104 <Option value={item.id} key={item.id}> 104 <Option value={item.id} key={item.id}>
@@ -106,7 +106,7 @@ export default function EditModal({ onClose, setItem, item, roleList }: Props) { @@ -106,7 +106,7 @@ export default function EditModal({ onClose, setItem, item, roleList }: Props) {
106 </Option> 106 </Option>
107 ))} 107 ))}
108 </Select> 108 </Select>
109 - </Form.Item> 109 + </Form.Item> */}
110 {/* 使用角色 */} 110 {/* 使用角色 */}
111 <Form.Item name="role" label="导入操作人员" rules={[{ required: true }]}> 111 <Form.Item name="role" label="导入操作人员" rules={[{ required: true }]}>
112 <Select placeholder="请选择导入操作角色类型" showSearch allowClear labelInValue optionFilterProp="children"> 112 <Select placeholder="请选择导入操作角色类型" showSearch allowClear labelInValue optionFilterProp="children">
src/pages/performance/EvaSetting/components/Filter.tsx
@@ -64,7 +64,7 @@ export default function Filter({ setParams, roleList }: Props) { @@ -64,7 +64,7 @@ export default function Filter({ setParams, roleList }: Props) {
64 </Option> 64 </Option>
65 ))} 65 ))}
66 </Select> 66 </Select>
67 - <Select 67 + {/* <Select
68 allowClear 68 allowClear
69 placeholder="选择归属系统" 69 placeholder="选择归属系统"
70 style={{ width: 260, marginRight: 5 }} 70 style={{ width: 260, marginRight: 5 }}
@@ -77,7 +77,7 @@ export default function Filter({ setParams, roleList }: Props) { @@ -77,7 +77,7 @@ export default function Filter({ setParams, roleList }: Props) {
77 {item.sysName} 77 {item.sysName}
78 </Select.Option> 78 </Select.Option>
79 ))} 79 ))}
80 - </Select> 80 + </Select> */}
81 <Select 81 <Select
82 placeholder="筛选禁用与启用" 82 placeholder="筛选禁用与启用"
83 style={{ width: 250, marginRight: 10, marginBottom: 10 }} 83 style={{ width: 250, marginRight: 10, marginBottom: 10 }}