import React, { Component } from "react";
import Taro from "@tarojs/taro";
import { Button, Text, View } from "@tarojs/components";
import dayjs from "dayjs";
import "./index.less";
import ImagePicker from "../../components/common/imagePicker";
import { AtButton, AtTextarea, AtIcon, AtCalendar } from "taro-ui";
import {
addPublicRelease,
getWorkingHoursList,
checkOrderNoDuration,
getRestrictProjectUser,
} from "../../utils/servers/servers";
import {
getHours,
getNumHourse,
getUserWordTimes,
getNameList,
isPublicity,
} from "../../utils/tools";
import "taro-ui/dist/style/components/form.scss";
import "taro-ui/dist/style/components/button.scss";
import "taro-ui/dist/style/components/loading.scss";
import "taro-ui/dist/style/components/icon.scss";
import "taro-ui/dist/style/components/icon.scss";
import "taro-ui/dist/style/components/textarea.scss";
import "taro-ui/dist/style/components/calendar.scss";
import "./publicContent.less";
import InquiryModal from "../../components/common/inquiryModal"; //提示弹窗
import UserQuery from "../../components/common/userquery"; //选择协单人弹窗
class PublicContent extends Component {
constructor(props) {
super(props);
this.state = {
rangeStartVal: "",
rangeEndVal: "",
rangeEndMinuteVal: "",
rangeStartMinuteVal: "",
reason: "",
plan: "",
expectedEffect: "",
imgs: [],
validDates: [],
totalDuration: 0,
loading: false,
workTypeList: [],
workType: 0,
isPickerRender: false,
coorderList: [],
cList: [],
popup: false,
isNewshow: false,
};
this.onSubmit = this.onSubmit.bind(this);
this.selectArrder = this.selectArrder.bind(this);
this.onChange = this.onChange.bind(this);
this.getWorkingHoursList = this.getWorkingHoursList.bind(this);
this.onPickerHide = this.onPickerHide.bind(this);
this.onSetPickerTime = this.onSetPickerTime.bind(this);
this.getNumHourse = this.getNumHourse.bind(this);
}
componentDidMount() {
Taro.eventCenter.on("result", () => {
this.imagePickerRef && this.imagePickerRef.clear();
this.setState({
rangeStartVal: "",
rangeEndVal: "",
rangeEndMinuteVal: "",
rangeStartMinuteVal: "",
reason: "",
plan: "",
expectedEffect: "",
imgs: [],
validDates: [],
totalDuration: 0,
loading: false,
});
});
this.getWorkingHoursList();
}
getNumHourse(startTime, endTime) {
this.setState({
totalDuration: getNumHourse(
startTime,
endTime,
this.state.validDates.length
),
});
}
// 增加 省 市 区拼接,地址带区域的则把区域去掉
getArea() {
const { selectArrderLocation } = this.props
let pcd = selectArrderLocation.province + selectArrderLocation.city + selectArrderLocation.district
let str = selectArrderLocation.name
let index = str.lastIndexOf("区")
let name = str.substring(index + 1)
return pcd + name
}
onSubmit() {
let objectType = this.props.enterpriseInfor.id.indexOf(',') > -1 ? 1 : 0
this.setState({
loading: true,
});
let datas = {
objectType,
uids: this.props.enterpriseInfor.id,
releaseStarts: this.state.rangeStartMinuteVal,
releaseEnds: this.state.rangeEndMinuteVal,
remarks: this.state.reason,
districtName: this.getArea(),
longitude: this.props.selectArrderLocation.longitude,
latitude: this.props.selectArrderLocation.latitude,
annexUrl: this.state.imgs.length === 0 ? "" : this.state.imgs.join(","),
duration: this.state.totalDuration,
type: this.props.enterpriseInfor.type,
validDate: JSON.stringify(this.state.validDates),
assist: this.state.coorderList.length === 0 ? 0 : 1,
assistAid: this.state.coorderList.length === 0 ? "" : this.state.coorderList.join(","),
assistAidName: this.state.coorderList.length === 0 ? "" : getNameList(this.state.coorderList, this.state.cList).join(","),
};
if (this.props.enterpriseInfor.type == 0) {
datas = {
...datas,
...{
plan: this.state.plan,
expectedEffect: this.state.expectedEffect,
}
};
} else if (this.props.enterpriseInfor.type == 2) {
datas = datas;
} else {
datas = {
...datas,
...{
plan: this.state.plan,
expectedEffect: this.state.expectedEffect,
orderNo: this.props.enterpriseInfor.orderNo,
}
};
}
addPublicRelease(datas)
.then((v) => {
this.setState({
loading: false,
});
let newData = {
...v.data,
...{
isShow: this.props.enterpriseInfor.type == 0
? isPublicity(this.props.enterpriseInfor.userList, 0) : this.props.enterpriseInfor.type == 1
? this.state.isNewshow : false,
list: isPublicity(this.props.enterpriseInfor.userList, 1)
}
}
if (v.error.length === 0) {
Taro.eventCenter.trigger("publicContent", newData);
} else {
Taro.showToast({
title: v.error[0].message,
icon: "none",
});
}
})
.catch(() => {
this.setState({
loading: false,
});
});
}
selectArrder() {
const key = "AWBBZ-GRAC2-JFYUO-CLA7I-JAHXK-YFFGT"; //使用在腾讯位置服务申请的key
const referer = "科德打卡定位"; //调用插件的app的名称
const category = "公司企业,房产小区";
Taro.navigateTo({
url:
"plugin://chooseLocation/index?key=" +
key +
"&referer=" +
referer +
"&category=" +
category,
});
}
onChange(value, type) {
let arr = this.state.imgs.concat([]);
if (type === "add") {
arr.push(value);
} else if (type === "remove") {
arr.splice(value, 1);
}
this.setState({
imgs: arr,
});
}
getWorkingHoursList() {
getWorkingHoursList({})
.then((v) => {
if (v.error.length === 0) {
let obj = Taro.getStorageSync("userInfor");
let index = v.data.findIndex(
(value) => value.type === obj.workTimeInfor.type
);
this.setState({
workType: index !== -1 ? index : 0,
});
this.setState({
workTypeList: v.data,
});
} else {
Taro.showToast({
title: v.error[0].message,
icon: "none",
});
}
})
.catch((err) => {
//console.log(err);
});
}
onPickerHide() {
this.setState({
isPickerRender: false,
});
}
onSetPickerTime(val) {
let data = val.detail;
this.setState({
rangeStartMinuteVal: data.selectStartTime,
rangeEndMinuteVal: data.selectEndTime,
});
let arr = [];
if (data.startTime && data.endTime) {
let a = dayjs(data.startTime);
let b = dayjs(data.endTime);
let num;
if (a.hour() <= b.hour()) {
num = b.diff(a, "day") + 1;
} else {
num = b.diff(a, "day") + 2;
}
let strAdd = data.startTime;
for (let i = 0; i < num; i++) {
let time = dayjs(strAdd).add(i, "days").format("YYYY-MM-DD");
arr.push({ value: time });
}
}
this.setState({
rangeEndVal: dayjs(data.endTime).format("YYYY-MM-DD"),
rangeStartVal: dayjs(data.startTime).format("YYYY-MM-DD"),
validDates: arr,
}, () => {
let a1 = dayjs(dayjs(data.endTime).format("YYYY-MM-DD HH:mm:ss"));
let b1 = dayjs(dayjs(data.startTime).format("YYYY-MM-DD HH:mm:ss"));
this.getNumHourse(b1, a1);
});
}
// 新增技术协单
setList(list, arr) {
this.setState({
cList: list,
coorderList: arr
})
}
// 弹窗开关
popupClick() {
this.setState({
popup: !this.state.popup
})
}
// 技术公出逻辑判断
checkOrderNoDuration() {
const _this = this
if (this.state.totalDuration == 0) {
Taro.showToast({ title: "请选择公出时间", icon: "none" });
return
}
checkOrderNoDuration({
duration: this.state.totalDuration,
orderNo: this.props.enterpriseInfor.orderNo,
})
.then((v) => {
if (v.error.length == 0) {
if (!v.data.code) {
let obj = v.data.data
_this.setState({
isNewshow: true,
isInquiryOpened: true,
inquiryTitle: "提醒",
inquiryContent:
您准备公出{obj.userName}({obj.contractNo}),
总计公出:{obj.peopleCount}人,{obj.timesCount}次,{obj.durationCount}时。
本合同{["低于1万元以下", "在1~3万", "在3~5万", "在5~10万", "在10万及以上"][obj.amountType]},
{["原则上技术人员不可下户", `本次申请,已超出${obj.durationMax}小时`, `本次公出申请,已超出${obj.durationMax}小时`, `本次公出申请,已超出${obj.durationMax}小时`, ""][obj.amountType]}
。
如需公出,需{obj.adminName}审核。
请确定,是否发起公出申请!
,
inquiryFn: () => {
_this.onSubmit();
},
})
} else {
_this.setState({
isNewshow: false,
isInquiryOpened: true,
inquiryTitle: "提醒",
inquiryContent: "您确定要提交此申请吗?",
inquiryFn: () => {
_this.onSubmit();
},
})
}
} else {
Taro.showToast({
title: v.error[0].message,
icon: "none",
});
}
})
.catch(() => {
this.setState({
loading: false,
});
});
}
// 业务公出限定项目
getRestrictProjectUser() {
const _this = this
getRestrictProjectUser({
ids: this.props.enterpriseInfor.id,
})
.then((v) => {
if (v.error.length === 0) {
let arr = []
if (v.data && v.data.length > 0) {
v.data.forEach(e => {
e.type == 1 && arr.push(e["userName"])
})
}
this.setState({
isInquiryOpened: true,
inquiryTitle: "提醒",
inquiryContent: arr.length > 0
? 您公出的{arr.toString()},为限定项目的企业,建议您由经理协助公出恰谈!
: "您确定要提交此申请吗?",
inquiryFn: () => {
_this.onSubmit();
},
});
} else {
Taro.showToast({
title: v.error[0].message,
icon: "none",
});
}
})
.catch((err) => {
});
}
render() {
const { cList, coorderList, popup } = this.state
const info = Taro.getStorageSync("userInfor");
return (
公出企业:
{
!!this.props.enterpriseInfor.name && this.props.enterpriseInfor.name.indexOf(',') > -1
? this.props.enterpriseInfor.name.split(',')?.map((item, index) => {item})
: this.props.enterpriseInfor.name
}
{
(this.props.enterpriseInfor.type == 0 && isPublicity(this.props.enterpriseInfor.userList, 0)) &&
您正在申请公出他人企业:需跟单员“
{isPublicity(this.props.enterpriseInfor.userList, 1).toString()}
”审核同意,您才可公出!
}
公出类型:
{this.props.enterpriseInfor.type == 0
? "业务公出" : this.props.enterpriseInfor.type == 1
? "技术公出" : this.props.enterpriseInfor.type == 2
? "行政公出" : this.props.enterpriseInfor.type == 3
? "技术协单" : ""}
{this.props.enterpriseInfor.contractNo ? (
合同编号:
{this.props.enterpriseInfor.contractNo}
) : (
""
)}
作息时间类型:
{this.state.workTypeList[this.state.workType]
? this.state.workTypeList[this.state.workType].name
: ""}
公出时间:
{
this.setState({
isPickerRender: true,
});
}}
>
{this.state.rangeStartMinuteVal &&
this.state.rangeEndMinuteVal ? (
开始时间:{this.state.rangeStartMinuteVal}
结束时间:{this.state.rangeEndMinuteVal}
) : (
"请选择公出时间"
)}
{
let a = dayjs(
dayjs(v.detail.endTime)
.second(0)
.format("YYYY-MM-DD HH:mm:ss")
);
let b = dayjs(dayjs().second(0).format("YYYY-MM-DD HH:mm:ss"));
if (a.isBefore(b)) {
Taro.showToast({
title: "结束时间不能小于当前时间",
icon: "none",
});
v.detail.setLv(false);
}
}}
onhidepicker={() => {
this.onPickerHide();
}}
onsetpickertime={(v) => {
this.onSetPickerTime(v);
}}
/>
总时长:
{this.state.totalDuration}小时
{this.state.validDates.length !== 0 ? (
去除放假时间:
绿色方块为公出时间,长按即可去除放假时间
{
if (
!(
dayjs(item.value).isSame(this.state.rangeStartVal) ||
dayjs(item.value).isSame(this.state.rangeEndVal)
)
) {
if (
!(
dayjs(item.value).isAfter(this.state.rangeStartVal) &&
dayjs(item.value).isBefore(this.state.rangeEndVal)
)
) {
return;
}
} else {
Taro.showToast({
title: "开始结束时间不能取消",
icon: "none",
});
return;
}
let index = this.state.validDates.findIndex((v) => {
let lv = dayjs(v.value).isSame(item.value);
return lv;
});
const { start, end } = getUserWordTimes();
let totalDuration = getHours(
dayjs().format("YYYY-MM-DD") + start,
dayjs(dayjs().format("YYYY-MM-DD") + end)
); //一天工作时长
if (index < 0) {
let arr = item.value.split("-");
this.state.validDates.push({ value: arr.join("-") });
this.setState({
validDates: this.state.validDates,
totalDuration: this.state.totalDuration + totalDuration,
});
} else {
this.state.validDates.splice(index, 1);
this.setState({
validDates: this.state.validDates,
totalDuration: this.state.totalDuration - totalDuration,
});
}
}}
/>
) : null}
公出地点:
{this.props.selectArrderLocation.name}
以地图为中心100米范围为可打卡区域,移动红标只需要拖动地图即可
{
this.props.enterpriseInfor.type === 0 &&
技术协单:
{
cList.length == 0
? 无
: cList.map((item, index) =>
{item.name}
{
coorderList.includes(item.id) &&
(
cList.splice(coorderList.indexOf(item.id), 1),
coorderList.splice(coorderList.indexOf(item.id), 1)
)
this.setState({
cList,
coorderList,
})
}}
>
)
}
{cList.length < 5 && }
}
{
this.props.enterpriseInfor.type === 0 &&
请与技术协商后,再发起协单,协单将统计公出成本等
}
{/* 公出目标 */}
*公出目标:
{
this.setState({
reason: v,
});
}}
maxLength={200}
placeholder={
this.props.enterpriseInfor.type == 2
? "详细说明本次公出的内容,预计完成的内容"
: "本次公出目标,谈的思路与步骤?"
}
/>
{/* 公出计划 */}
{this.props.enterpriseInfor.type != 2 && (
*公出计划:
{
this.setState({
plan: v,
});
}}
maxLength={200}
placeholder="本次公出准备工作"
/>
)}
{/* 预计效果 */}
{this.props.enterpriseInfor.type != 2 && (
*预计效果:
{
this.setState({
expectedEffect: v,
});
}}
maxLength={200}
placeholder="预计本次公出效果"
/>
)}
{/* */}
{this.state.totalDuration > info.workTimeInfor.minHours && *}
附件:
{this.state.totalDuration > info.workTimeInfor.minHours &&
请上传公出事由的凭证截图,如您与企业的对话截图等
}
(this.imagePickerRef = ref)}
url="/api/admin/release/upload"
onChange={this.onChange}
/>
{
Taro.eventCenter.trigger("enterpriseBack");
}}
>
上一步
{
if (this.state.loading) {
return;
}
if (!this.state.rangeStartMinuteVal) {
Taro.showToast({ title: "请选择公出时间", icon: "none" });
return;
}
if (!this.state.rangeEndMinuteVal) {
Taro.showToast({ title: "请选择公出时间", icon: "none" });
return;
}
if (
!(
this.props.selectArrderLocation.longitude &&
this.props.selectArrderLocation.latitude
)
) {
Taro.showToast({ title: "请选择公出地点", icon: "none" });
return;
}
if (!this.state.reason) {
Taro.showToast({ title: "请输入公出目标", icon: "none" });
return;
}
if (!this.state.plan && this.props.enterpriseInfor.type != 2) {
Taro.showToast({ title: "请输入公出计划", icon: "none" });
return;
}
if (!this.state.expectedEffect && this.props.enterpriseInfor.type != 2) {
Taro.showToast({ title: "请输入预计效果", icon: "none" });
return;
}
if (this.state.totalDuration === 0) {
Taro.showToast({
title: "请选择公出时间,目前设置公出时间不足0.5小时",
icon: "none",
});
return;
}
let info = Taro.getStorageSync("userInfor");
if (this.state.totalDuration > info.workTimeInfor.minHours && this.state.imgs.length == 0) {
Taro.showToast({ title: "请上传附件", icon: "none" });
return
}
this.props.enterpriseInfor.type == 1
? this.checkOrderNoDuration()
: this.props.enterpriseInfor.type == 0
? this.getRestrictProjectUser()
: this.setState({
isInquiryOpened: true,
inquiryTitle: "提醒",
inquiryContent: "您确定要提交此申请吗?",
inquiryFn: () => {
this.onSubmit();
},
});
}}
>
提交申请
{
this.setState({
isInquiryOpened: false,
inquiryTitle: "",
inquiryContent: "",
});
}}
onDetermine={() => {
this.state.inquiryFn();
this.setState({
isInquiryOpened: false,
inquiryTitle: "",
inquiryContent: "",
inquiryFn: () => { },
});
}}
/>
{popup &&
}
);
}
}
export default PublicContent;