|
|
@ -4,22 +4,35 @@ import { connect } from 'react-redux'; |
|
|
|
import { Modal, Form, Button, Notification } from '@douyinfe/semi-ui'; |
|
|
|
import { IconUpload } from '@douyinfe/semi-icons'; |
|
|
|
import XLSX from 'xlsx'; |
|
|
|
import moment from 'moment'; |
|
|
|
import { invoicingDetailsColumnKeys } from '../../constants/index'; |
|
|
|
const ColumnDateKey = ['invoiceDate']; |
|
|
|
const ColumnDateName = ['开票日期']; |
|
|
|
//下载模板和上传文件读取
|
|
|
|
const ImportInvoicingDetailsModal = props => { |
|
|
|
const { dispatch, actions, onCancel } = props; |
|
|
|
const { humanAffairs } = actions; |
|
|
|
const { businessManagement } = actions; |
|
|
|
const [msg, setMsg] = useState(''); |
|
|
|
const [loading, setLoading] = useState(''); |
|
|
|
const [postData, setPostData] = useState([]); |
|
|
|
const [uploadAble, setUploadAble] = useState(false); |
|
|
|
const [allNumbers, setAllNumbers] = useState([]); |
|
|
|
//初始化
|
|
|
|
useEffect(() => { |
|
|
|
//查询明细表已存在编号数据接口通用
|
|
|
|
dispatch(businessManagement.getReceivedNumbers({ tableModel: 'InvoiceDetail' })).then(r => { |
|
|
|
if (r.success) { |
|
|
|
setUploadAble(true); |
|
|
|
setAllNumbers(r.payload.data); |
|
|
|
} |
|
|
|
}) |
|
|
|
}, []); |
|
|
|
|
|
|
|
const confirm = () => { |
|
|
|
if (postData.length) { |
|
|
|
setLoading(true) |
|
|
|
dispatch(humanAffairs.addSalesMemberBulk(postData)).then(res => { |
|
|
|
//导入明细接口通用
|
|
|
|
dispatch(businessManagement.importBackDetails(postData, { tableModel: 'InvoiceDetail' })).then(res => { |
|
|
|
if (res.success) { |
|
|
|
onCancel() |
|
|
|
} |
|
|
@ -94,9 +107,21 @@ const ImportInvoicingDetailsModal = props => { |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const judgeNull = (value) => { |
|
|
|
return value ? String(value).trim().replace(/\s*/g, "") : null; |
|
|
|
const judgeTimeValid = (time) => { |
|
|
|
let valid = true; |
|
|
|
if (!time) { |
|
|
|
return valid;//可以不填
|
|
|
|
} |
|
|
|
const ymd = /^((19|20)[0-9]{2})[\/\-]((0[1-9])|(1[0-2]))[\/\-]((0[1-9])|((1|2)[0-9])|(3[0-1]))$/;//年月日
|
|
|
|
if (time instanceof Date) { |
|
|
|
let timeStr = moment(time).format('YYYY/MM/DD'); |
|
|
|
if (!ymd.test(timeStr)) { |
|
|
|
valid = false; |
|
|
|
} |
|
|
|
} else { |
|
|
|
valid = false; |
|
|
|
} |
|
|
|
return valid; |
|
|
|
} |
|
|
|
|
|
|
|
return ( |
|
|
@ -137,12 +162,46 @@ const ImportInvoicingDetailsModal = props => { |
|
|
|
return |
|
|
|
} |
|
|
|
let postData = []; |
|
|
|
let yearPattern = /^(19|20)\d{2}$/;//1900-2099年
|
|
|
|
let zzsPattern = /^[+]{0,1}(\d+)$/;//正整数
|
|
|
|
for (let i = 0; i < res.length; i++) { |
|
|
|
let d = res[i]; |
|
|
|
let obj = {}; |
|
|
|
Object.keys(invoicingDetailsColumnKeys).map(key => { |
|
|
|
obj[key] = d[invoicingDetailsColumnKeys[key]] || ''; |
|
|
|
obj[key] = d[invoicingDetailsColumnKeys[key]] || null; |
|
|
|
}) |
|
|
|
//年度 序号 编号必填
|
|
|
|
if (!obj.year || !obj.serialNo || !obj.number) { |
|
|
|
error(`第${i + 2}行【年度】、【序号】、【编号】存在空值,请填写`) |
|
|
|
return |
|
|
|
} |
|
|
|
//年度
|
|
|
|
if (obj.year && !yearPattern.test(obj.year)) { |
|
|
|
error(`第${i + 2}行【年度】填写错误`) |
|
|
|
return |
|
|
|
} |
|
|
|
//序号 正整数
|
|
|
|
if (obj.serialNo && !zzsPattern.test(obj.serialNo)) { |
|
|
|
error(`第${i + 2}行【序号】填写错误,需要为非负整数`) |
|
|
|
return |
|
|
|
} |
|
|
|
let exist = allNumbers.find(m => m.number == obj.number);//数据库中 已有该编号
|
|
|
|
if (exist) { |
|
|
|
error(`第${i + 2}行的【编号】在系统中已存在`) |
|
|
|
return |
|
|
|
} |
|
|
|
if (postData.some(p => p.number == obj.number)) {//编号 唯一
|
|
|
|
error(`第${i + 2}行【编号】重复,请更改后重新上传`) |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
for (let k = 0; k < ColumnDateKey.length; k++) { |
|
|
|
let cValid = judgeTimeValid(obj[ColumnDateKey[k]]); |
|
|
|
if (!cValid) { |
|
|
|
error(`第${i + 2}行【${ColumnDateName[k]}】错误,请填写yyyy/mm/dd格式`) |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
postData.push(obj); |
|
|
|
} |
|
|
|
setPostData(postData) |
|
|
@ -151,7 +210,7 @@ const ImportInvoicingDetailsModal = props => { |
|
|
|
onSuccess({ message: msg }) |
|
|
|
}) |
|
|
|
}}> |
|
|
|
<Button icon={<IconUpload />} theme="light"> |
|
|
|
<Button icon={<IconUpload />} theme="light" disabled={!uploadAble}> |
|
|
|
请选择文件 |
|
|
|
</Button> |
|
|
|
</Form.Upload> |
|
|
|