dev01 10 ヶ月 前
コミット
15510ea4d4
共有35 個のファイルを変更した3237 個の追加159 個の削除を含む
  1. 9 0
      src/app.config.js
  2. 2 2
      src/app.jsx
  3. 136 0
      src/components/common/superior/index.jsx
  4. 0 0
      src/components/common/superior/index.less
  5. 1 1
      src/components/common/userFloatingLayer/index.less
  6. BIN
      src/image/enterpriseSelect.png
  7. BIN
      src/image/enterpriseUnSelect.png
  8. 0 1
      src/pages/applyDepart/publicContent.jsx
  9. 6 0
      src/pages/customerProfile/index.config.js
  10. 822 0
      src/pages/customerProfile/index.jsx
  11. 188 0
      src/pages/customerProfile/index.less
  12. 1 1
      src/pages/egressDetails/index.css
  13. 4 2
      src/pages/egressDetails/index.jsx
  14. 1 1
      src/pages/egressDetails/index.less
  15. 0 11
      src/pages/egressDetails/publicContent.jsx
  16. 8 0
      src/pages/enterprise/index.config.js
  17. 420 0
      src/pages/enterprise/index.jsx
  18. 100 0
      src/pages/enterprise/index.less
  19. 140 0
      src/pages/enterprise/list.jsx
  20. 217 61
      src/pages/examine/index.jsx
  21. 83 4
      src/pages/examine/index.less
  22. 68 17
      src/pages/examine/myList.jsx
  23. 8 3
      src/pages/login/index.jsx
  24. 134 3
      src/pages/mybusiness/index.jsx
  25. 58 2
      src/pages/mybusiness/index.less
  26. 4 1
      src/pages/punchClock/index.jsx
  27. 22 9
      src/pages/punchClock/punchClocks.jsx
  28. 6 0
      src/pages/situation/index.config.js
  29. 339 0
      src/pages/situation/index.jsx
  30. 169 0
      src/pages/situation/index.less
  31. 2 2
      src/utils/config.js
  32. 2 2
      src/utils/servers/baseUrl.js
  33. 85 2
      src/utils/servers/servers.js
  34. 171 33
      src/utils/tools/config.js
  35. 31 1
      src/utils/tools/index.js

+ 9 - 0
src/app.config.js

@@ -7,6 +7,9 @@ export default {
     'pages/login/index',//登录
     'pages/applyDepart/index',//申请公出
     'pages/mybusiness/index',//我的
+    'pages/enterprise/index',//企业
+    'pages/customerProfile/index',//企业详情
+    'pages/situation/index',//公出情况
   ],
   tabBar: {
     list: [
@@ -29,6 +32,12 @@ export default {
         text: '审核'
       },
       {
+        iconPath: './image/enterpriseUnSelect.png',
+        selectedIconPath: './image/enterpriseSelect.png',
+        pagePath: 'pages/enterprise/index',
+        text: '企业'
+      },
+      {
         iconPath: './image/my.png',
         selectedIconPath: './image/myselect.png',
         pagePath: 'pages/mybusiness/index',

+ 2 - 2
src/app.jsx

@@ -89,9 +89,9 @@ class App extends Component {
       // 生产
       // url: 'wss://bm.jishutao.com/webSocketServer',
       // 本地
-      url: 'wss://172.16.1.199:8080/webSocketServer'
+      // url: 'wss://172.16.1.199:8080/webSocketServer'
       // 测试
-      // url: 'wss://uat.jishutao.com/webSocketServer'
+      url: 'wss://uat.jishutao.com/webSocketServer'
     })
 
     //连接成功

+ 136 - 0
src/components/common/superior/index.jsx

@@ -0,0 +1,136 @@
+import React, { Component } from "react";
+import { View, Button, } from "@tarojs/components";
+import Taro from '@tarojs/taro';
+import {
+  AtModal,
+  AtModalHeader,
+  AtModalContent,
+  AtModalAction,
+  AtTextarea,
+  AtIcon,
+} from "taro-ui";
+import { getUserSuperEvaluate, addUserSuperEvaluate } from '../../../utils/servers/servers'
+import './index.less';
+
+import "taro-ui/dist/style/components/modal.scss";
+import 'taro-ui/dist/style/components/icon.scss';
+
+class Superior extends Component {
+  constructor(props) {
+    super(props);
+    this.state = {
+      text: "",
+      opinion: [],
+    }
+
+  }
+
+  componentWillMount() {
+    this.getUserSuperEvaluate()
+  }
+
+  getUserSuperEvaluate() {
+    const { id } = this.props
+    getUserSuperEvaluate({
+      uid: id,
+      pageNo: 1,
+      pageSize: 999,
+    }).then((v) => {
+      if (v.error.length === 0) {
+        this.setState({
+          opinion: v.data.list
+        })
+      } else {
+        Taro.showToast({ title: v.error[0].message, icon: "none" });
+      }
+    }).catch(() => {
+
+    })
+  }
+
+  onOK() {
+    const { id } = this.props
+    addUserSuperEvaluate({
+      uid: id,
+      content: this.state.text,
+    }).then((v) => {
+      if (v.error.length === 0) {
+        Taro.showToast({ title: "操作成功" });
+        this.props.onClose();
+      } else {
+        Taro.showToast({ title: v.error[0].message, icon: "none" });
+      }
+    }).catch(() => {
+
+    })
+  }
+
+  render() {
+    const { isOpinion, userNames, isFill } = this.props
+    const { opinion } = this.state
+    return (
+      <>
+        <AtModal
+          isOpened={isOpinion}
+        >
+          <AtModalHeader>企业-上级指导</AtModalHeader>
+          <AtModalContent>
+            <View style={{ margin: "0 0 10px", color: "#6190E8" }}>{userNames}</View>
+            {
+              isFill &&
+              <AtTextarea
+                value={this.state.text}
+                onChange={e => {
+                  this.setState({ text: e })
+                }}
+                maxLength={200}
+                placeholder='请填写对企业的评价'
+              />
+            }
+            <View className='historicalClock'>
+              {
+                opinion.length > 0
+                  ? opinion.map(item =>
+                    <View key={item.id} className='item'>
+                      <View className='head'>
+                        <View className='spot' />
+                        <View className='clockTime' style={{ color: "#6190E8" }}>
+                          {item.adminName}
+                        </View>
+                      </View>
+                      <View className='clockContent'>
+                        <View className='verticalLine' style={{ borderColor: "transparent" }} />
+                        <View className='rightContent'>
+                          <View className='contentItem'>
+                            <AtIcon className='atIcon' value='clock' size='15' color='#999999' />
+                            操作时间:{item.createTime}
+                          </View>
+                          <View className='contentItem'>
+                            <AtIcon className='atIcon' value='message' size='15' color='#999999' />
+                            评价:{item.content || "暂无"}
+                          </View>
+                        </View>
+                      </View>
+                    </View>
+                  )
+                  : <View style={{ textAlign: "center" }}>暂无指导意见</View>
+              }
+            </View>
+          </AtModalContent>
+          {
+            isFill
+              ? <AtModalAction>
+                <Button type='secondary' onClick={() => { this.props.onClose() }}>取消</Button>
+                <Button type='primary' onClick={this.onOK.bind(this)}>确定</Button>
+              </AtModalAction>
+              : <AtModalAction>
+                <Button type='secondary' onClick={() => { this.props.onClose() }}>确定</Button>
+              </AtModalAction>
+          }
+        </AtModal>
+      </>
+    )
+  }
+}
+
+export default Superior;

+ 0 - 0
src/components/common/superior/index.less


+ 1 - 1
src/components/common/userFloatingLayer/index.less

@@ -20,7 +20,7 @@
     z-index: 1;
     top: 0;
     left: 20px;
-    padding: 20px 30px 20px 80px;
+    padding: 20px 20px 20px 80px;
     height: 40px;
     background: #56abe4;
     border-radius: 115px;

BIN
src/image/enterpriseSelect.png


BIN
src/image/enterpriseUnSelect.png


+ 0 - 1
src/pages/applyDepart/publicContent.jsx

@@ -99,7 +99,6 @@ class PublicContent extends Component {
   // 增加 省 市 区拼接,地址带区域的则把区域去掉
   getArea() {
     const { selectArrderLocation } = this.props
-
     let address = selectArrderLocation.name;
     let defaultProvince = selectArrderLocation.province || "";
     let defaultCity = selectArrderLocation.city || "";

+ 6 - 0
src/pages/customerProfile/index.config.js

@@ -0,0 +1,6 @@
+export default {
+  navigationBarTitleText: '客户档案',
+  usingComponents: {
+    timePicker: '../../components/common/timePicker/timePicker'
+  }
+}

+ 822 - 0
src/pages/customerProfile/index.jsx

@@ -0,0 +1,822 @@
+import React, { Component } from "react";
+import { View, Input, Button, Text, Picker } from "@tarojs/components";
+import Taro, { getCurrentInstance } from "@tarojs/taro";
+import {
+  AtCheckbox,
+  AtTextarea,
+  AtModal,
+  AtModalHeader,
+  AtModalContent,
+  AtModalAction,
+  AtInput,
+} from "taro-ui";
+import Skeleton from "taro-skeleton";
+import {
+  queryByUidAll,
+  updateUserDate,
+  addOneContact,
+  findCustomerContacts,
+  updateMainContact,
+  limitUser,
+  getBusinessProjectByName,
+} from "../../utils/servers/servers";
+import "./index.less";
+
+import "taro-ui/dist/style/components/icon.scss";
+import "taro-ui/dist/style/components/textarea.scss";
+import "taro-ui/dist/style/components/modal.scss";
+import "taro-ui/dist/style/components/timeline.scss";
+import "taro-ui/dist/style/components/calendar.scss";
+import "taro-ui/dist/style/components/input.scss";
+import "taro-ui/dist/style/components/checkbox.scss";
+import MessageNoticebar from "../../components/common/messageNoticebar";
+import { industry } from '../../utils/tools/config';
+import Superior from "../../components/common/superior";
+
+
+class CustomerProfile extends Component {
+  $instance = getCurrentInstance();
+
+  constructor(props) {
+    super(props);
+    this.state = {
+      upType: -1,
+      isOpened: false,
+      dtails: {},
+      info: {},
+      sector: {},
+      isAdd: false,
+      obj: {},
+      userList: [],
+      options: [],
+      checkOptions: [],
+
+      isSuperior: false,
+    };
+    this.queryByUidAll = this.queryByUidAll.bind(this);
+    this.update = this.update.bind(this);
+    this.add = this.add.bind(this);
+    this.getUserList = this.getUserList.bind(this);
+    this.getBusinessProjectByName = this.getBusinessProjectByName.bind(this);
+
+  }
+
+  componentDidMount() {
+    this.queryByUidAll();
+  }
+
+  componentDidShow() {
+
+  }
+  // 客户档案详情
+  queryByUidAll() {
+    queryByUidAll({
+      id: this.$instance.router.params.id,
+    })
+      .then((v) => {
+        if (v.error.length === 0) {
+          this.setState({
+            dtails: v.data
+          })
+        } else {
+          Taro.showToast({ title: v.error[0].message, icon: "none" });
+        }
+      })
+      .catch((err) => {
+        Taro.showToast({ title: "系统错误,请稍后再试", icon: "none" });
+      });
+  }
+  // 修改客户档案
+  update() {
+    const { upType, info } = this.state
+    let tipList = [
+      { key: "inventionPatentCount", value: "请填写发明专利数" },
+      { key: "utilityModelCount", value: "请填写实用新型数" },
+      { key: "appearancePatentCount", value: "请填写外观专利数" },
+      { key: "softwareWorksCount", value: "请填写软著数" },
+      { key: "otherCount", value: "请填写其他数量" },
+      { key: "financialData", value: "请填写财务数据" },
+      { key: "earlyCommunication", value: "请填写前期沟通" },
+      { key: "interviewIdeas", value: "请填写面谈思路及目的" },
+    ]
+    if (!info.id) {
+      delete info.id
+    }
+    for (let i in info) {
+      if (!info[i] && info[i] !== 0) {
+        for (var j = 0; j < tipList.length; j++) {
+          if (tipList[j].key == i) {
+            Taro.showToast({
+              title: tipList[j].value,
+              icon: "none",
+            });
+          }
+        }
+        return
+      }
+    }
+    updateUserDate(upType, info).then((v) => {
+      if (v.error.length === 0) {
+        Taro.showToast({
+          title: "修改成功",
+        });
+        this.setState({
+          isOpened: false
+        })
+        this.queryByUidAll()
+      } else {
+        Taro.showToast({
+          title: v.error[0].message,
+          icon: "none",
+        });
+      }
+    }).catch(() => {
+
+    })
+  }
+  // 新建联系人
+  add() {
+    let data = this.state.obj
+    for (let i in data) {
+      if (!data[i] && data[i] !== 0) {
+        Taro.showToast({
+          title: "请完善信息",
+          icon: "none",
+        });
+        return
+      } else if (i == "mobile") {
+        if (!(/^1[34578]\d{9}$/.test(data[i]))) {
+          Taro.showToast({
+            title: "请输入正确地手机号",
+            icon: "none",
+          });
+          return
+        }
+      }
+    }
+    data.major = 1
+    addOneContact(data).then((v) => {
+      if (v.error.length === 0) {
+        Taro.showToast({
+          title: "添加成功",
+        });
+        this.setState({
+          isAdd: false
+        })
+        this.queryByUidAll()
+      } else {
+        Taro.showToast({
+          title: v.error[0].message,
+          icon: "none",
+        });
+      }
+    }).catch(() => {
+
+    })
+  }
+  // 项目列表
+  getBusinessProjectByName() {
+    getBusinessProjectByName({
+      businessName: "",
+    })
+      .then((v) => {
+        if (v.error.length === 0) {
+          let theArr = [];
+          if (v.data.length > 0) {
+            for (let i = 0; i < v.data.length; i++) {
+              let thisdata = v.data[i];
+              theArr.push({
+                value: thisdata.bname,
+                label: thisdata.bname,
+              });
+            };
+          }
+          this.setState({
+            options: theArr
+          })
+        } else {
+          Taro.showToast({ title: v.error[0].message, icon: "none" });
+        }
+      })
+      .catch((err) => {
+        Taro.showToast({ title: "系统错误,请稍后再试", icon: "none" });
+      });
+  }
+
+  getUserList() {
+    findCustomerContacts({
+      uid: this.$instance.router.params.id,
+    })
+      .then((v) => {
+        if (v.error.length === 0) {
+          this.setState({
+            userList: v.data || []
+          })
+        } else {
+          Taro.showToast({ title: v.error[0].message, icon: "none" });
+        }
+      })
+      .catch((err) => {
+        Taro.showToast({ title: "系统错误,请稍后再试", icon: "none" });
+      });
+  }
+
+  updateMainContact(id) {
+    updateMainContact({
+      uid: this.$instance.router.params.id,
+      ocbId: id,
+    }).then((v) => {
+      if (v.error.length === 0) {
+        Taro.showToast({
+          title: "设置成功",
+        });
+        this.getUserList()
+      } else {
+        Taro.showToast({
+          title: v.error[0].message,
+          icon: "none",
+        });
+      }
+    }).catch(() => {
+
+    })
+  }
+
+  limitUser() {
+    limitUser({
+      uid: this.$instance.router.params.id,
+      // hours: 1,
+    }).then((v) => {
+      if (v.error.length === 0) {
+
+      } else {
+        Taro.showToast({
+          title: v.error[0].message,
+          icon: "none",
+        });
+      }
+    }).catch(() => {
+
+    })
+  }
+
+  onShareAppMessage() {
+    this.limitUser();
+    return {
+      title: "客户档案",
+      path: "pages/customerProfile/index?id=" + this.$instance.router.params.id + "&signBills=" + this.$instance.router.params.signBills,
+    };
+  }
+
+  render() {
+    const { dtails, upType, info, obj, userList } = this.state;
+    return (
+      <View className="customerProfile">
+        <MessageNoticebar />
+        <View
+          className="titleContent"
+          style={{
+            padding: Object.keys(dtails).length === 0 ? "0 20px" : "0px 0px",
+          }}
+        >
+          {Object.keys(dtails).length === 0 ? (
+            <Skeleton
+              title
+              row={3}
+              animateName="elastic"
+              avatarShape="square"
+              loading
+            />
+          ) : (
+            <View className="content">
+              <View className="name">
+                <Text style={{ width: "80%" }}>
+                  <Text className="bod">{dtails.nickname}&nbsp;&nbsp;</Text>
+                  <Text style={{ fontSize: "12px", color: ["red", "green"][this.$instance.router.params.signBills] }}>{["未签单", "已签单"][this.$instance.router.params.signBills]}</Text>
+                </Text>
+                {dtails.myUser == 1 && <Button className="share" plain type='primary' open-type="share">分享</Button>}
+                {/* <View className="share">分享</View> */}
+              </View>
+              <View className="button">
+                <View className="but"
+                  onClick={e => {
+                    e.stopPropagation()
+                    this.setState({
+                      isSuperior: true
+                    })
+                  }}
+                >上级指导</View>
+                {
+                  this.state.isSuperior &&
+                  <Superior
+                    id={dtails.uid}
+                    userNames={dtails.nickname}
+                    isOpinion={this.state.isSuperior}
+                    isFill={dtails.myUser == 0}
+                    onClose={() => {
+                      this.setState({
+                        isSuperior: false
+                      })
+                    }}
+                  />
+                }
+                <View className="but"
+                  onClick={e => {
+                    e.stopPropagation()
+                    Taro.navigateTo({
+                      url: "/pages/situation/index?id=" + this.$instance.router.params.id + "&signBills=" + this.$instance.router.params.signBills + "&nickname=" + dtails.nickname,
+                    });
+                  }}
+                >公出记录</View>
+              </View>
+              <View className="row">
+                <View className="code">{dtails.orgCode}</View>
+                <View className="time">{dtails.createTime}</View>
+              </View>
+
+              <View className="first">
+                <View className="tit">
+                  企业所属行业及主要产品
+                  {
+                    dtails.myUser == 1 &&
+                    <View className="up"
+                      onClick={e => {
+                        e.stopPropagation()
+                        this.setState({
+                          upType: 0,
+                          isOpened: true,
+                          info: {
+                            uid: this.$instance.router.params.id,
+                            industry: dtails.industry,
+                            businessScope: dtails.businessScope,
+                          },
+                          sector: {
+                            id: dtails.industry,
+                            title: dtails.industryName
+                          }
+                        })
+                      }}
+                    >修改</View>
+                  }
+                </View>
+                <View className="val">行业:{dtails.industryName}</View>
+                <View className="val">主营产品/服务:{dtails.businessScope}</View>
+                <View className="tit">
+                  意向合作项目
+                  {
+                    dtails.myUser == 1 &&
+                    <View className="up"
+                      onClick={e => {
+                        e.stopPropagation()
+                        this.getBusinessProjectByName()
+                        this.setState({
+                          upType: 5,
+                          isOpened: true,
+                          info: {
+                            uid: this.$instance.router.params.id,
+                            intendedProject: dtails.intendedProject,
+                          },
+                          checkOptions: !!dtails.intendedProject ? dtails.intendedProject.split(",") : []
+                        })
+                      }}
+                    >修改</View>
+                  }
+                </View>
+                <View className="val">{dtails.intendedProject || "无"}</View>
+                <View className="tit">
+                  <Text>
+                    联系人
+                    <Text className="txt">(面谈人)</Text>
+                  </Text>
+                  {
+                    dtails.myUser == 1 &&
+                    <View className="up"
+                      onClick={e => {
+                        e.stopPropagation()
+                        this.getUserList();
+                        this.setState({
+                          isAdd: true,
+                          obj: {
+                            uid: this.$instance.router.params.id,
+                            name: "",
+                            position: "",
+                            department: "",
+                            mobile: "",
+                          }
+                        })
+                      }}
+                    >新增</View>
+                  }
+                </View>
+                {
+                  !!dtails.contactList && dtails.contactList.map((v, k) =>
+                    <View className="val" key={k}>{v.name}&nbsp;&nbsp;{v.position}&nbsp;&nbsp;{v.department}&nbsp;&nbsp;{v.mobile}</View>
+                  )
+                }
+              </View>
+
+              <View className="two">
+                <View className="title">面谈企业情况</View>
+                <View className="tit">
+                  <Text>
+                    知识产权情况
+                    <Text className="txt">(专利信息、标准、专利、软著)</Text>
+                  </Text>
+                  {
+                    dtails.myUser == 1 &&
+                    <View className="up"
+                      onClick={e => {
+                        e.stopPropagation()
+                        this.setState({
+                          upType: 1,
+                          isOpened: true,
+                          info: {
+                            uid: this.$instance.router.params.id,
+                            id: dtails.id,
+                            inventionPatentCount: dtails.inventionPatentCount || 0,
+                            utilityModelCount: dtails.utilityModelCount || 0,
+                            appearancePatentCount: dtails.appearancePatentCount || 0,
+                            softwareWorksCount: dtails.softwareWorksCount || 0,
+                            otherCount: dtails.otherCount || 0,
+                          }
+                        })
+                      }}
+                    >修改</View>
+                  }
+                </View>
+                <View className="val">
+                  专利&nbsp;<Text className="num">{dtails.patentCount || 0}</Text>&nbsp;&nbsp;&nbsp;
+                  其中发明专利&nbsp;<Text className="num">{dtails.inventionPatentCount || 0}</Text>&nbsp;&nbsp;&nbsp;
+                  实用新型&nbsp;<Text className="num">{dtails.utilityModelCount || 0}</Text>&nbsp;&nbsp;&nbsp;
+                  外观设计&nbsp;<Text className="num">{dtails.appearancePatentCount || 0}</Text>&nbsp;&nbsp;&nbsp;
+                  软著&nbsp;<Text className="num">{dtails.softwareWorksCount || 0}</Text>&nbsp;&nbsp;&nbsp;
+                  其他类型&nbsp;<Text className="num">{dtails.otherCount || 0}</Text>&nbsp;&nbsp;&nbsp;
+                </View>
+                <View className="tit">
+                  <Text>
+                    财务数据
+                    <Text className="txt">(包括营收、税收、资产、研发费用等)</Text>
+                  </Text>
+                  {
+                    dtails.myUser == 1 &&
+                    <View className="up"
+                      onClick={e => {
+                        e.stopPropagation()
+                        this.setState({
+                          upType: 2,
+                          isOpened: true,
+                          info: {
+                            uid: this.$instance.router.params.id,
+                            id: dtails.id,
+                            financialData: dtails.financialData,
+                          }
+                        })
+                      }}
+                    >修改</View>
+                  }
+                </View>
+                <View className="val">{dtails.financialData || "无"}</View>
+                <View className="tit">
+                  <Text>
+                    前期沟通
+                    <Text className="txt">(客户的难处、需求)</Text>
+                  </Text>
+                  {
+                    dtails.myUser == 1 &&
+                    <View className="up"
+                      onClick={e => {
+                        e.stopPropagation()
+                        this.setState({
+                          upType: 3,
+                          isOpened: true,
+                          info: {
+                            uid: this.$instance.router.params.id,
+                            id: dtails.id,
+                            earlyCommunication: dtails.earlyCommunication,
+                          }
+                        })
+                      }}
+                    >修改</View>
+                  }
+                </View>
+                <View className="val">{dtails.earlyCommunication || "无"}</View>
+                <View className="tit">
+                  <Text>
+                    面谈思路及目的
+                  </Text>
+                  {
+                    dtails.myUser == 1 &&
+                    <View className="up"
+                      onClick={e => {
+                        e.stopPropagation()
+                        this.setState({
+                          upType: 4,
+                          isOpened: true,
+                          info: {
+                            uid: this.$instance.router.params.id,
+                            id: dtails.id,
+                            interviewIdeas: dtails.interviewIdeas,
+                          }
+                        })
+                      }}
+                    >修改</View>
+                  }
+                </View>
+                <View className="val">{dtails.interviewIdeas || "无"}</View>
+              </View>
+            </View>
+          )}
+        </View>
+
+        <AtModal
+          isOpened={this.state.isOpened}
+        >
+          <AtModalHeader>信息修改</AtModalHeader>
+          <AtModalContent>
+            {
+              upType == 0 &&
+              <View>
+                <View className='selectTitle'>企业行业</View>
+                <Picker
+                  value={this.state.sector.id}
+                  range={industry} rangeKey='title' mode='selector'
+                  onChange={(e) => {
+                    this.setState({
+                      sector: industry[e.detail.value],
+                      info: Object.assign(info, {
+                        industry: industry[e.detail.value].id,
+                      })
+                    })
+                  }}>
+                  <View style={{ marginBottom: "10px", color: !this.state.sector.title && "#CCCCCC" }}>
+                    {!this.state.sector.title ? "请选择" : this.state.sector.title}
+                  </View>
+                </Picker>
+                <View className='selectTitle'>企业主营产品/服务</View>
+                <Input
+                  // name='value'
+                  // title='企业主营产品/服务'
+                  type='text'
+                  placeholder='请用,符号隔开关键字'
+                  value={info.businessScope}
+                  onInput={e => {
+                    this.setState({
+                      info: Object.assign(info, {
+                        businessScope: e.detail.value,
+                      })
+                    })
+                  }}
+                />
+              </View>
+            }
+            {
+              upType == 1 &&
+              <View>
+                <AtInput
+                  name='inventionPatentCount'
+                  title='发明专利'
+                  type='number'
+                  value={info.inventionPatentCount}
+                  onChange={e => {
+                    this.setState({
+                      info: Object.assign(info, {
+                        inventionPatentCount: e,
+                      })
+                    })
+                  }}
+                />
+                <AtInput
+                  name='utilityModelCount'
+                  title='实用新型'
+                  type='number'
+                  value={info.utilityModelCount}
+                  onChange={e => {
+                    this.setState({
+                      info: Object.assign(info, {
+                        utilityModelCount: e,
+                      })
+                    })
+                  }}
+                />
+                <AtInput
+                  name='appearancePatentCount'
+                  title='外观专利'
+                  type='number'
+                  value={info.appearancePatentCount}
+                  onChange={e => {
+                    this.setState({
+                      info: Object.assign(info, {
+                        appearancePatentCount: e,
+                      })
+                    })
+                  }}
+                />
+                <AtInput
+                  name='softwareWorksCount'
+                  title='软著'
+                  type='number'
+                  value={info.softwareWorksCount}
+                  onChange={e => {
+                    this.setState({
+                      info: Object.assign(info, {
+                        softwareWorksCount: e,
+                      })
+                    })
+                  }}
+                />
+                <AtInput
+                  name='otherCount'
+                  title='其他'
+                  type='number'
+                  value={info.otherCount}
+                  onChange={e => {
+                    this.setState({
+                      info: Object.assign(info, {
+                        otherCount: e,
+                      })
+                    })
+                  }}
+                />
+              </View>
+            }
+            {
+              upType == 2 &&
+              <View>
+                <View className='selectTitle'>财务数据</View>
+                <AtTextarea
+                  value={info.financialData || ""}
+                  onChange={e => {
+                    this.setState({
+                      info: Object.assign(info, {
+                        financialData: e,
+                      }),
+                    })
+                  }}
+                  maxLength={200}
+                  placeholder='请填写~'
+                />
+              </View>
+            }
+            {
+              upType == 3 &&
+              <View>
+                <View className='selectTitle'>前期沟通</View>
+                <AtTextarea
+                  value={info.earlyCommunication || ""}
+                  onChange={e => {
+                    this.setState({
+                      info: Object.assign(info, {
+                        earlyCommunication: e,
+                      }),
+                    })
+                  }}
+                  maxLength={200}
+                  placeholder='请填写~'
+                />
+              </View>
+            }
+            {
+              upType == 4 &&
+              <View>
+                <View className='selectTitle'>面谈思路及目的</View>
+                <AtTextarea
+                  value={info.interviewIdeas || ""}
+                  onChange={e => {
+                    this.setState({
+                      info: Object.assign(info, {
+                        interviewIdeas: e,
+                      }),
+                    })
+                  }}
+                  maxLength={200}
+                  placeholder='请填写~'
+                />
+              </View>
+            }
+            {
+              upType == 5 &&
+              <View>
+                <AtCheckbox
+                  options={this.state.options}
+                  selectedList={this.state.checkOptions}
+                  onChange={e => {
+                    this.setState({
+                      checkOptions: e,
+                      info: Object.assign(info, {
+                        intendedProject: e.toString(),
+                      }),
+                    })
+                  }}
+                />
+              </View>
+            }
+          </AtModalContent>
+          <AtModalAction>
+            <Button type='secondary' onClick={() => { this.setState({ isOpened: false }) }}>取消</Button>
+            <Button type='primary' onClick={this.update}>确定修改</Button>
+          </AtModalAction>
+        </AtModal>
+
+        <AtModal
+          isOpened={this.state.isAdd}
+        >
+          <AtModalHeader>联系人</AtModalHeader>
+          <AtModalContent>
+            {
+              userList.map((item) =>
+                <View key={item.id} className="additem">
+                  <Text className="txt">{item.name || "无"}</Text>
+                  <Text className="txt">{item.position || "无"}</Text>
+                  <Text className="txt">{item.department || "无"}</Text>
+                  <Text className="mobile">{item.mobile || "无"}</Text>
+                  <View
+                    className={item.major == 1 ? "bts" : "bt"}
+                    onClick={() => {
+                      item.major != 1 && this.updateMainContact(item.id)
+                    }}
+                  >
+                    {item.major == 1 ? "已选" : "选择"}
+                  </View>
+                </View>
+              )
+            }
+            <AtInput
+              required
+              name='name'
+              title='姓名'
+              type='text'
+              placeholder='请填写姓名'
+              value={obj.name}
+              onChange={e => {
+                this.setState({
+                  obj: Object.assign(obj, {
+                    name: e,
+                  })
+                })
+              }}
+            />
+            <AtInput
+              required
+              name='position'
+              title='职位'
+              type='text'
+              placeholder='请填写职位'
+              value={obj.position}
+              onChange={e => {
+                this.setState({
+                  obj: Object.assign(obj, {
+                    position: e,
+                  })
+                })
+              }}
+            />
+            <AtInput
+              required
+              name='department'
+              title='部门'
+              type='text'
+              placeholder='请填写部门'
+              value={obj.department}
+              onChange={e => {
+                this.setState({
+                  obj: Object.assign(obj, {
+                    department: e,
+                  })
+                })
+              }}
+            />
+            <AtInput
+              required
+              name='mobile'
+              title='手机'
+              type='phone'
+              placeholder='请填写手机号'
+              value={obj.mobile}
+              onChange={e => {
+                this.setState({
+                  obj: Object.assign(obj, {
+                    mobile: e,
+                  })
+                })
+              }}
+            />
+          </AtModalContent>
+          <AtModalAction>
+            <Button type='secondary'
+              onClick={() => {
+                this.setState({
+                  isAdd: false
+                }, () => {
+                  this.queryByUidAll()
+                })
+              }}>取消</Button>
+            <Button type='primary' onClick={this.add}>保存</Button>
+          </AtModalAction>
+        </AtModal>
+
+      </View>
+    );
+  }
+}
+
+export default CustomerProfile;

+ 188 - 0
src/pages/customerProfile/index.less

@@ -0,0 +1,188 @@
+.customerProfile {
+  min-height: calc(100vh - 30px);
+  background: #F5F5F5;
+  padding-bottom: 30px;
+
+  .titleContent {
+    position: relative;
+    // background: white;
+    // padding: 20px 20px;
+    // border-bottom: 1px #dadada solid;
+
+    .content {
+
+      .name {
+        font-size: 32px;
+        color: #1E90FF;
+        font-weight: bolder;
+        padding-bottom: 10px;
+        display: flex;
+        flex-direction: row;
+        flex-wrap: wrap;
+        align-items: flex-start;
+        justify-content: space-between;
+        background: white;
+        padding: 20px;
+        margin-bottom: 20px;
+
+        .bod {
+          // border-bottom: 2px solid #1E90FF;
+          // padding-bottom: 10px;
+        }
+
+        .share {
+          margin: 0;
+          padding: 0;
+          font-size: 26px;
+          line-height: 24px;
+          color: #1E90FF;
+          padding: 10px 30px;
+          border: 1px solid #1E90FF;
+          border-radius: 30px;
+        }
+
+      }
+
+      .button {
+        display: flex;
+        flex-direction: row-reverse;
+        padding: 20px 20px 0;
+        background: white;
+
+        .but {
+          background: #1E90FF;
+          padding: 10px 15px;
+          color: #FFFFFF;
+          font-size: 26px;
+          border-radius: 8px;
+          margin-left: 20px;
+
+        }
+
+      }
+
+      .row {
+        background: white;
+        display: flex;
+        flex-direction: row;
+        align-items: center;
+        justify-content: space-between;
+        padding: 20px 20px;
+
+        .code {
+          font-size: 26px;
+          color: #767272;
+
+        }
+
+        .time {
+          font-size: 26px;
+          color: #767272;
+
+        }
+
+      }
+
+      .first {
+        background: #facd91;
+        padding: 20px 20px;
+
+      }
+
+      .two {
+        background: #81d3f8;
+        padding: 20px 20px;
+
+      }
+
+      .title {
+        font-weight: bolder;
+        margin: 20px 0 10px 0;
+      }
+
+      .tit {
+        display: flex;
+        flex-direction: row;
+        align-items: baseline;
+        justify-content: space-between;
+        font-size: 28px;
+        font-weight: bolder;
+        margin-top: 15px;
+        margin-bottom: 5px;
+
+        .up {
+          background: #70B603;
+          color: #FFFFFF;
+          padding: 10px 20px;
+          font-size: 26px;
+          border-radius: 8px;
+          font-weight: 400;
+
+        }
+
+        .txt {
+          color: red;
+          font-weight: 400;
+          font-size: 20px;
+        }
+
+      }
+
+      .val {
+        font-size: 26px;
+
+        .num {
+          font-weight: bolder;
+          color: #1E90FF;
+        }
+
+      }
+
+    }
+
+  }
+
+}
+
+.selectTitle {
+  font-weight: bolder;
+  margin-bottom: 5px;
+  font-size: 28px;
+}
+
+.additem {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: space-between;
+  font-size: 22px;
+  color: #4395ff;
+  margin-bottom: 15px;
+
+  .txt {
+    width: 16%;
+    display: flex;
+    // flex: 1;
+  }
+
+  .mobile {
+    width: 30%;
+  }
+
+  .bt {
+    padding: 4px 10px;
+    background: #4395ff;
+    color: #FFFFFF;
+    border-radius: 6px;
+    margin-left: 15px;
+
+  }
+
+  .bts {
+    padding: 4px 10px;
+    color: #4395ff;
+    margin-left: 15px;
+
+  }
+
+}

+ 1 - 1
src/pages/egressDetails/index.css

@@ -7,7 +7,7 @@
 .egressDetails .titleContent {
   position: relative;
   background: white;
-  padding: 20px 30px;
+  padding: 20px 20px;
   border-bottom: 1px #dadada solid;
 }
 

+ 4 - 2
src/pages/egressDetails/index.jsx

@@ -237,7 +237,8 @@ class EgressDetails extends Component {
     // Taro.showLoading({ title: "加载中..." });
     let isSuperior = this.state.current == "他人公出"
       ? (this.state.sonType == 4 ? 2 : this.state.sonType == 5 && 3)
-      : 1
+      : this.state.current == "协单审核" ? 4
+        : 1
     examinePublicRelease(
       isSuperior,
       {
@@ -674,7 +675,8 @@ class EgressDetails extends Component {
                 </View>
               </View>
             ) : null}
-            {((dtails.status === 1 && current === "审核") ||
+            {((current === "协单审核") ||
+              (dtails.status === 1 && current === "审核") ||
               (dtails.publicType == 1 && current === "他人公出" && dtails.myExamine == 0) ||
               (dtails.techStartProcess == 1 && current === "他人公出" && dtails.myExamine == 0)) &&
               <View className="item">

+ 1 - 1
src/pages/egressDetails/index.less

@@ -6,7 +6,7 @@
   .titleContent {
     position: relative;
     background: white;
-    padding: 20px 30px;
+    padding: 20px 20px;
     border-bottom: 1px #dadada solid;
 
     .title {

+ 0 - 11
src/pages/egressDetails/publicContent.jsx

@@ -181,16 +181,6 @@ class PublicContent extends Component {
   // 增加 省 市 区拼接,地址带区域的则把区域去掉
   getArea() {
     const { locationInfor } = this.props
-    // if (locationInfor.province || locationInfor.city || locationInfor.district) {
-    //   let pcd = locationInfor.province + locationInfor.city + locationInfor.district
-    //   let str = locationInfor.name
-    //   let index = str.lastIndexOf("区")
-    //   let name = str.substring(index + 1)
-    //   return pcd + name
-    // } else {
-    //   let str = locationInfor.name
-    //   return str
-    // }
     let address = locationInfor.name;
     let defaultProvince = locationInfor.province || "";
     let defaultCity = locationInfor.city || "";
@@ -208,7 +198,6 @@ class PublicContent extends Component {
     if (address.indexOf(cityKeyword) === -1) {
       address = address.replace(provinceKeyword, `${provinceKeyword}${defaultCity}`);
     }
-    console.log(address.indexOf(districtKeyword) + "===" + address.indexOf("小区"))
     if (address.indexOf(districtKeyword) !== -1 && address.indexOf("小区") !== -1) {
       address = address.replace(cityKeyword, `${cityKeyword}${defaultDistrict}`);
     } else if (address.indexOf(districtKeyword) === -1) {

+ 8 - 0
src/pages/enterprise/index.config.js

@@ -0,0 +1,8 @@
+export default {
+  navigationBarTitleText: '企业',
+  enablePullDownRefresh: true,
+  onReachBottomDistance: 50,
+  usingComponents: {
+    timePicker: '../../components/common/PickerReduce/timePicker'
+  }
+}

+ 420 - 0
src/pages/enterprise/index.jsx

@@ -0,0 +1,420 @@
+import React, { Component } from 'react';
+import Taro from '@tarojs/taro';
+import { View, Picker, ScrollView, Button } from '@tarojs/components'
+import {
+  selectMyUser,
+  selectMyUserDetails,
+} from '../../utils/servers/servers';
+import dayjs from 'dayjs';
+import {
+  AtSearchBar,
+  AtTabs,
+  AtTabsPane,
+  AtIcon,
+  AtModal,
+  AtModalContent,
+  AtModalAction,
+  AtTextarea
+} from 'taro-ui';
+import { shareType, levelType } from '../../utils/tools/config';
+
+import './index.less';
+import 'taro-ui/dist/style/components/tabs.scss';
+import "taro-ui/dist/style/components/flex.scss";
+import "taro-ui/dist/style/components/action-sheet.scss";
+import "taro-ui/dist/style/components/icon.scss";
+import "taro-ui/dist/style/components/list.scss";
+import "taro-ui/dist/style/components/icon.scss";
+import "taro-ui/dist/style/components/modal.scss";
+
+import List from './list';
+import MessageNoticebar from "../../components/common/messageNoticebar";
+
+class Enterprise extends Component {
+
+  constructor(props) {
+    super(props);
+    this.state = {
+      typeList: [
+        { title: '我的企业' },
+        { title: '公出过的企业' }],
+      current: 0,
+      list: [],
+      pageNo: 1,
+      listState: 'LOADING',
+      starts: {},
+      level: {},
+
+    }
+    this.selectMyUser = this.selectMyUser.bind(this);
+    this.getMyList = this.getMyList.bind(this);
+    this.onSetPickerTime = this.onSetPickerTime.bind(this);
+    this.onPickerHide = this.onPickerHide.bind(this);
+  }
+
+  componentDidShow() {
+    this.selectMyUser();
+  }
+
+
+  onPullDownRefresh() {
+    this.selectMyUser();
+  }
+
+  onReachBottom() {
+    this.selectMyUser(true);
+  }
+
+  onTabItemTap(obj) {
+    if (obj.index === 1) {
+      this.onTabTap();
+    }
+  }
+
+  onPickerHide() {
+    this.setState({
+      isPickerRender: false,
+    });
+  }
+
+
+  async onSetPickerTime(val) {
+    let data = val.detail;
+    await this.setState({
+      rangeStartMinuteVal: dayjs(data.selectStartTime).format("YYYY-MM-DD"),
+      rangeEndMinuteVal: dayjs(data.selectEndTime).format("YYYY-MM-DD")
+    })
+    await this.getMyList(1);
+  }
+
+  async onTabTap() {
+    await this.getMyList(1);
+  }
+
+  async selectMyUser(lv) {
+    await this.getMyList(lv ? this.state.pageNo + 1 : 1);
+    Taro.stopPullDownRefresh();
+  }
+
+  async getMyList(pageNo) {
+    this.setState({
+      listState: 'LOADING'
+    })
+    let data = {
+      pageNo: pageNo,
+      pageSize: 10,
+      type: this.state.current,
+      // releaseStarts: this.state.rangeStartMinuteVal || undefined,
+      // releaseEnds: this.state.rangeEndMinuteVal || undefined,
+      shareType: isNaN(parseInt(this.state.starts.id)) ? undefined : String(this.state.starts.id),
+      level: isNaN(parseInt(this.state.level.id)) ? undefined : String(this.state.level.id),
+      name: this.state.searchValue || undefined,
+    }
+    for (let i in data) {
+      if (!data[i]) {
+        delete data[i]
+      }
+    }
+    let msg = await selectMyUser(data);
+    if (msg.error.length === 0) {
+      if (msg.data.totalCount === 0) {
+        this.setState({
+          listState: 'NO_DATA'
+        })
+      } else if (msg.data.totalCount === this.state.list.length && pageNo !== 1) {
+        // 防止提示挡住驳回弹窗
+        !this.state.isOpen && Taro.showToast({ title: '没有更多数据了', icon: 'none' });
+        this.setState({
+          listState: 'NO_MORE_DATA'
+        })
+      } else {
+        if (msg.data.totalCount === (pageNo === 1 ? msg.data.list : this.state.list.concat(msg.data.list)).length) {
+          this.setState({
+            listState: 'NO_MORE_DATA'
+          })
+        }
+      }
+      this.setState({
+        list: pageNo === 1 ? msg.data.list : this.state.list.concat(msg.data.list),
+        pageNo: msg.data.list.length === 0 ? this.state.pageNo : msg.data.pageNo
+      })
+    } else {
+      Taro.showToast({ title: msg.error[0].message, icon: 'none' });
+      this.setState({
+        listState: msg.error[0].field === '403' ? 'NO_DATA' : 'RELOAD'
+      })
+    }
+    Taro.stopPullDownRefresh();
+  }
+
+  onPageScroll(event) {
+    let touchMove = event.scrollTop;
+    if (touchMove >= 37) {
+      this.setState({
+        openSearch: true
+      })
+    } else {
+      this.setState({
+        openSearch: false
+      })
+    }
+  }
+
+  selectMyUserDetails(obj) {
+    selectMyUserDetails({
+      id: obj.id,
+    }).then(v => {
+      if (v.error.length === 0) {
+        let newList = this.state.list
+        for (var i = 0; i < newList.length; i++) {
+          if (newList[i].id == obj.id) {
+            newList[i].count = v.data.count
+            newList[i].minPublicRelease = v.data.minPublicRelease
+            newList[i].maxPublicRelease = v.data.maxPublicRelease
+            newList[i].latestFollow = v.data.latestFollow
+          }
+        }
+        this.setState({
+          list: newList
+        })
+      } else {
+        Taro.showToast({ title: v.error[0].message, icon: 'none' })
+      }
+    }).catch(() => {
+      Taro.hideLoading()
+      Taro.showToast({
+        title: '系统错误,请稍后再试',
+        icon: 'none'
+      })
+    })
+  }
+
+  onHide(obj) {
+    let newList = this.state.list
+    for (var i = 0; i < newList.length; i++) {
+      if (newList[i].id == obj.id) {
+        delete newList[i].count
+        delete newList[i].minPublicRelease
+        delete newList[i].maxPublicRelease
+        delete newList[i].latestFollow
+      }
+    }
+    this.setState({
+      list: newList
+    })
+  }
+
+
+  render() {
+    return (
+      <View className='indexPage' >
+        <MessageNoticebar />
+        <View className='searchContent'>
+          <View className='searchTop'>
+            <AtSearchBar
+              showActionButton
+              placeholder='请输入企业/渠道'
+              value={this.state.searchValue}
+              onActionClick={() => {
+                this.selectMyUser();
+              }}
+              onChange={(value) => {
+                this.setState({
+                  searchValue: value
+                })
+              }}
+              onClear={() => {
+                this.setState({
+                  searchValue: ''
+                })
+              }}
+            />
+          </View>
+          <ScrollView className={this.state.openSearch ? 'searchBottomLOL' : ''} scrollX style={{ width: '100%' }}>
+            <View className='searchBottom'>
+              <View className='searchItem' style={{ paddingLeft: '5px' }}>
+                <Picker
+                  value={this.state.starts.id}
+                  range={shareType} rangeKey='title' mode='selector'
+                  onChange={(e) => {
+                    this.setState({
+                      starts: shareType[e.detail.value],
+                    }, () => {
+                      this.selectMyUser();
+                    })
+                  }}>
+                  {
+                    !this.state.starts.title ?
+                      <View className='shortValuecontent'>
+                        <View className='selectTitle'>客户类型</View>
+                        <View className='iconContent'><AtIcon value='chevron-down' size='10' color='#FFFFFF' /></View>
+                      </View> :
+                      <View className='shortValuecontent'>
+                        <View className='selectValue'>
+                          {this.state.starts.title}
+                        </View>
+                        <View className='iconContent' />
+                      </View>
+                  }
+                </Picker>
+                {
+                  this.state.starts.title &&
+                  <View className='searchSelectContent'>
+                    <View className='selectIcon'
+                      onClick={(e) => {
+                        e.stopPropagation();
+                        this.setState({
+                          starts: {}
+                        }, () => {
+                          this.selectMyUser();
+                        })
+                      }}>
+                      <AtIcon value='close-circle' size='10' color='#FFFFFF' />
+                    </View>
+                  </View>
+                }
+              </View>
+              <View className='searchItem' >
+                <Picker
+                  value={this.state.level.id}
+                  range={levelType} rangeKey='title' mode='selector'
+                  onChange={(e) => {
+                    this.setState({
+                      level: levelType[e.detail.value]
+                    }, () => {
+                      this.selectMyUser();
+                    })
+                  }}>
+                  {
+                    !this.state.level.title ?
+                      <View className='shortValuecontent'>
+                        <View className='selectTitle'>客户等级</View>
+                        <View className='iconContent'><AtIcon value='chevron-down' size='10' color='#FFFFFF' /></View>
+                      </View> :
+                      <View className='shortValuecontent'>
+                        <View className='selectValue'>
+                          {this.state.level.title}
+                        </View>
+                        <View className='iconContent' />
+                      </View>
+                  }
+                </Picker>
+                {
+                  this.state.level.title ?
+                    <View className='searchSelectContent'>
+                      <View className='selectIcon'
+                        onClick={(e) => {
+                          e.stopPropagation();
+                          this.setState({
+                            level: {},
+                          }, () => {
+                            this.selectMyUser();
+                          })
+                        }}>
+                        <AtIcon value='close-circle' size='10' color='#FFFFFF' />
+                      </View>
+                    </View> : null
+                }
+              </View>
+              {/*  */}
+              {/* 多选时间框 */}
+              <View className='searchItem' onClick={() => {
+                this.setState({
+                  isPickerRender: true
+                })
+              }}>
+                <View>
+                  {
+                    !this.state.rangeStartMinuteVal ?
+                      <View className='valuecontent' style={{ width: '200px' }}>
+                        <View className='selectTitle' style={{ paddingLeft: '50px' }}>开始及结束时间</View>
+                        <View className='iconContent' style={{ paddingLeft: '20px' }}><AtIcon value='chevron-down' size='10' color='#FFFFFF' /></View>
+                      </View> :
+                      <View className='valuecontent' style={{ width: '200px' }}>
+                        <View className='selectValue' >
+                          {this.state.rangeStartMinuteVal + "~" + this.state.rangeEndMinuteVal}
+                        </View>
+                        <View className='iconContent' />
+                      </View>
+                  }
+                </View>
+                {
+                  this.state.rangeStartMinuteVal &&
+                  <View className='searchSelectContent'>
+                    <View className='selectIcon'
+                      onClick={(e) => {
+                        e.stopPropagation();
+                        this.setState({
+                          rangeStartMinuteVal: '',
+                          rangeEndMinuteVal: '',
+                        }, () => {
+                          this.selectMyUser();
+                        })
+                      }}>
+                      <AtIcon value='close-circle' size='10' color='#FFFFFF' />
+                    </View>
+                  </View>
+                }
+              </View>
+            </View>
+          </ScrollView>
+        </View>
+        <AtTabs
+          swipeable={false}
+          current={this.state.current || 0}
+          tabList={this.state.typeList}
+          onClick={(current) => {
+            this.setState({
+              list: [],
+              pageNo: 1,
+              current,
+            }, () => {
+              this.selectMyUser();
+            })
+          }}>
+          {
+            this.state.typeList?.map((item, index) =>
+              <AtTabsPane
+                current={this.state.current}
+                index={index}
+              >
+                <List
+                  list={this.state.list}
+                  listState={this.state.listState}
+                  onRefresh={() => {
+                    this.selectMyUser(true);
+                  }}
+                  getMore={e => {
+                    this.selectMyUserDetails(e);
+                  }}
+                  onHide={e => {
+                    this.onHide(e)
+                  }}
+                />
+              </AtTabsPane>
+            )
+          }
+        </AtTabs>
+        <timePicker
+          config={{
+            endDate: true,
+            column: "day",
+            dateLimit: false,
+            limitStartTime: dayjs().subtract(3, 'year').format('YYYY-MM-DD '),
+            limitEndTime: dayjs().add(3, 'year').format('YYYY-MM-DD ')
+          }}
+          isPartition
+          pickerShow={this.state.isPickerRender}
+          onhidepicker={() => {
+            this.onPickerHide()
+          }}
+          onsetpickertime={(v) => {
+            this.onSetPickerTime(v)
+          }}>
+        </timePicker>
+      </View>
+    )
+  }
+}
+
+export default Enterprise

+ 100 - 0
src/pages/enterprise/index.less

@@ -0,0 +1,100 @@
+.elist {
+  padding: 20px 23px 52px 23px;
+
+  .eitem {
+    border-radius: 6px;
+    padding: 31px;
+    background: #FFFFFF;
+    display: flex;
+    flex-flow: row nowrap;
+    margin-bottom: 17px;
+    position: relative;
+    overflow: hidden;
+
+    .einfor {
+      width: 100%;
+      position: relative;
+
+      .etitle {
+        font-size: 30px;
+        display: flex;
+        flex-flow: column;
+        padding-bottom: 10px;
+
+        .ename {
+          flex: 1;
+          padding-right: 20px;
+          font-weight: bolder;
+          display: flex;
+          flex-direction: row;
+          align-items: center;
+
+        }
+
+        .ecode {
+          font-size: 24px;
+          font-weight: 400;
+        }
+
+      }
+
+      .etime {
+        font-size: 30px;
+        padding-bottom: 10px;
+
+      }
+
+      .euserName {
+        font-size: 25px;
+        color: #999999;
+        padding-bottom: 10px;
+        display: flex;
+        flex-flow: row nowrap;
+        align-items: center;
+        justify-content: space-between;
+        position: relative;
+
+        .euNtext {
+          width: 540px;
+          overflow: hidden;
+          white-space: nowrap;
+          text-overflow: ellipsis;
+        }
+
+      }
+
+      .emore{
+        font-size: 26px;
+        margin: 10px 0;
+        color: #58A3FF;
+      }
+
+    }
+  }
+}
+
+.ereject {
+  font-size: 24px;
+  position: absolute;
+  right: -31px;
+  top: 0px;
+  border-bottom-left-radius: 100px;
+  border-top-left-radius: 100px;
+  padding: 15px;
+  color: white;
+  background: rgba(22, 155, 213, 1);
+
+}
+
+.eselect {
+  font-size: 24px;
+  position: absolute;
+  right: -31px;
+  top: 100px;
+  border-bottom-left-radius: 100px;
+  border-top-left-radius: 100px;
+  padding: 15px;
+  color: white;
+  background: #F1662F;
+
+}

+ 140 - 0
src/pages/enterprise/list.jsx

@@ -0,0 +1,140 @@
+import React, { Component } from "react";
+import Taro from "@tarojs/taro";
+import { View, Text, Image, Button } from "@tarojs/components";
+import Skeleton from "taro-skeleton";
+import { getClockState } from "../../utils/tools";
+import ListBottomStart from "../../components/common/listBottomStart";
+import RevokeWhite from "../../image/revokeWhite.png";
+import "./index.less";
+
+class MyList extends Component {
+  constructor(props) {
+    super(props);
+  }
+
+  render() {
+    return (
+      <View className="indexPage">
+        <View className="elist">
+          {
+            this.props.list.length === 0 && this.props.listState === "LOADING" &&
+            this.props.typelist?.map((v) => (
+              <Skeleton key={v} title row={3} avatarShape="square" loading />
+            ))
+          }
+          {this.props.list.length > 0 && this.props.list?.map((v, k) => (
+            <View
+              key={k}
+              className="eitem"
+            >
+              <View className="einfor">
+                <View className="etitle">
+                  <View className="ename">
+                    {v.nickname}
+                  </View>
+                  <View className="ecode">
+                    <Text onClick={() => {
+                      Taro.setClipboardData({
+                        data: v.orgCode,
+                        success: function (res) {
+                          Taro.showToast({
+                            title: '复制成功',
+                          });
+                        }
+                      })
+                    }}>{v.orgCode}{v.orgCode && " [复制]"}</Text>
+                  </View>
+                </View>
+                <View className="etime"
+                  style={{ color: ["red", "green"][v.signBills] }}
+                >{["未签单", "已签单"][v.signBills]}
+                  {v.signBills == 1 && v.signTime && ("(" + v.signTime + ")")}
+                </View>
+                <View className="euserName">
+                  <View className="euNtext">
+                    营销员:{v.adminName}
+                  </View>
+                </View>
+                {
+                  !v.latestFollow &&
+                  <View className="emore"
+                    onClick={e => {
+                      e.stopPropagation()
+                      this.props.getMore(v)
+                    }}>查看更多 ▼</View>
+                }
+                {
+                  !!v.latestFollow &&
+                  <View>
+                    <View className="euserName">
+                      <View className="euNtext">
+                        累计公出次数:{v.count}
+                      </View>
+                    </View>
+                    <View className="euserName">
+                      <View className="euNtext">
+                        首次面谈时间:{!v.minPublicRelease.id ? "无" : (v.minPublicRelease.releaseStart + "【" + v.minPublicRelease.aname + "】")}
+                      </View>
+                    </View>
+                    <View className="euserName">
+                      <View className="euNtext">
+                        最新公出时间:{!v.maxPublicRelease.id ? "无" : (v.maxPublicRelease.releaseStart + "【" + v.maxPublicRelease.aname + "】")}
+                      </View>
+                    </View>
+                    <View className="euserName">
+                      <View className="euNtext">
+                        最新跟进时间:{!v.latestFollow.id ? "无" : (v.latestFollow.followTime + "【" + v.latestFollow.followName + "】")}
+                      </View>
+                    </View>
+                  </View>
+                }
+                {
+                  !!v.latestFollow &&
+                  <View className="emore"
+                    onClick={e => {
+                      e.stopPropagation()
+                      this.props.onHide(v)
+                    }}>收起 ▲</View>
+                }
+                {
+                  <View
+                    className="ereject"
+                    onClick={e => {
+                      e.stopPropagation();
+                      Taro.navigateTo({
+                        url: "/pages/situation/index?id=" + v.id + "&signBills=" + v.signBills + "&nickname=" + v.nickname,
+                      });
+                    }}
+                  >
+                    公出情况
+                  </View>
+                }
+                {
+                  <View
+                    className="eselect"
+                    onClick={e => {
+                      e.stopPropagation();
+                      Taro.navigateTo({
+                        url: "/pages/customerProfile/index?id=" + v.id + "&signBills=" + v.signBills,
+                      });
+                    }}
+                  >
+                    客户档案
+                  </View>
+                }
+              </View>
+            </View>
+          ))}
+          <ListBottomStart
+            state={this.props.listState}
+            reload={() => {
+              this.props.onRefresh;
+            }}
+          />
+        </View>
+      </View>
+    );
+  }
+}
+
+export default MyList;

+ 217 - 61
src/pages/examine/index.jsx

@@ -1,7 +1,7 @@
 import React, { Component } from 'react';
 import Taro from '@tarojs/taro';
 import { View, Picker, ScrollView, Button } from '@tarojs/components'
-import { getPublicReleaseList, techReject } from '../../utils/servers/servers';
+import { getPublicReleaseList, techReject, getAssistUnaudited, publicAssistAdviceList } from '../../utils/servers/servers';
 import dayjs from 'dayjs';
 import {
   AtSearchBar,
@@ -9,6 +9,7 @@ import {
   AtTabsPane,
   AtIcon,
   AtModal,
+  AtModalHeader,
   AtModalContent,
   AtModalAction,
   AtTextarea
@@ -22,7 +23,7 @@ import "taro-ui/dist/style/components/flex.scss";
 import "taro-ui/dist/style/components/action-sheet.scss";
 import "taro-ui/dist/style/components/icon.scss";
 import "taro-ui/dist/style/components/list.scss";
-import "taro-ui/dist/style/components/icon.scss";
+import "taro-ui/dist/style/components/modal.scss";
 
 import MyList from './myList';
 import MessageNoticebar from "../../components/common/messageNoticebar";
@@ -35,13 +36,16 @@ class Examine extends Component {
       typeList: [
         { title: '审核', type: 1 },
         { title: '查看公出', type: 2 },
-        { title: '查看协单', type: 3 },
+        { title: '协单审核', type: 3 },
         { title: '他人公出', type: 4 }],
       current: 0,
       sonTypes: [
         { lable: '技术员公出', value: 5 },
         { lable: '营销员公出', value: 4 },
       ],
+      type: 1,
+      current: 0,
+      title: "审核",
       selcotype: 4,
       isPickerRender: false,
       validDates: '',
@@ -57,6 +61,9 @@ class Examine extends Component {
       id: "",
       rmk: "",
       isOpen: false,
+      isOpinion: false,
+      opinion: [],
+      isFill: true,
 
     }
     this.getPublicReleaseList = this.getPublicReleaseList.bind(this);
@@ -80,12 +87,37 @@ class Examine extends Component {
     })
 
     this.getPublicReleaseList();
+    this.assistUnaudited();
   }
 
   async componentDidMount() {
     await this.getPublicReleaseList();
   }
 
+  // 协单未审核查询
+  assistUnaudited() {
+    getAssistUnaudited({}).then(v => {
+      if (v.error.length === 0) {
+        let newList = this.state.typeList
+        newList[0].num = v.data.unaudited
+        newList[1].num = 0
+        newList[2].num = v.data.assistUnaudited
+        newList[3].num = v.data.otherUnaudited
+        this.setState({
+          typeList: newList
+        })
+      } else {
+        Taro.showToast({ title: v.error[0].message, icon: 'none' })
+      }
+    }).catch(() => {
+      Taro.hideLoading()
+      Taro.showToast({
+        title: '系统错误,请稍后再试',
+        icon: 'none'
+      })
+    })
+  }
+
   onPullDownRefresh() {
     this.getPublicReleaseList();
   }
@@ -135,7 +167,7 @@ class Examine extends Component {
       type: current === 0
         ? 1 : current === 1
           ? 2 : current === 2
-            ? 3 : current === 3 && this.state.selcotype,
+            ? 6 : current === 3 && this.state.selcotype,
       releaseStarts: this.state.rangeStartMinuteVal || undefined,
       releaseEnds: this.state.rangeEndMinuteVal || undefined,
       status: isNaN(parseInt(this.state.starts.id)) ? undefined : String(this.state.starts.id),
@@ -221,6 +253,60 @@ class Examine extends Component {
     })
   }
 
+  onOpinion() {
+    if (!this.state.remarks) {
+      Taro.showToast({ title: '请填写协单意见!', icon: 'none' });
+      return
+    }
+    Taro.showLoading({ title: '正在提交...' });
+    publicAssistAdvice({
+      prid: this.state.id,
+      remarks: this.state.remarks,
+    }).then(v => {
+      Taro.hideLoading()
+      if (v.error.length === 0) {
+        Taro.showToast({ title: '填写成功', icon: 'none' });
+        this.getPublicReleaseList();
+        this.setState({
+          isOpinion: false,
+          remarks: "",
+        })
+      } else {
+        Taro.showToast({ title: v.error[0].message, icon: 'none' })
+      }
+    }).catch(() => {
+      Taro.hideLoading()
+      Taro.showToast({
+        title: '系统错误,请稍后再试',
+        icon: 'none'
+      })
+    })
+  }
+
+  publicAssistAdviceList(t, obj) {
+    publicAssistAdviceList({
+      id: obj.id,
+      type: t == "我的公出" ? 1 : 0,
+    }).then(v => {
+      if (v.error.length === 0) {
+        this.setState({
+          info: obj,
+          opinion: v.data,
+          isOpinion: true,
+          isFill: t == "我的协单" ? true : false
+        })
+      } else {
+        Taro.showToast({ title: v.error[0].message, icon: 'none' })
+      }
+    }).catch(() => {
+      Taro.hideLoading()
+      Taro.showToast({
+        title: '系统错误,请稍后再试',
+        icon: 'none'
+      })
+    })
+  }
+
   render() {
     return (
       <View className='indexPage' >
@@ -380,68 +466,76 @@ class Examine extends Component {
             </View>
           </ScrollView>
         </View>
-        <AtTabs
-          swipeable={false}
-          current={this.state.current || 0}
-          tabList={this.state.typeList}
-          onClick={(current) => {
-            this.setState({
-              list: [],
-              pageNo: 1,
-              current,
-            }, () => {
-              this.getPublicReleaseList();
-            })
-          }}>
+        <View className='tab'>
           {
-            this.state.typeList?.map((item, index) =>
-              <AtTabsPane
-                current={this.state.current}
-                index={index}
+            this.state.typeList.map((v, i) =>
+              <View
+                className={this.state.current == i ? 'titems' : 'titem'}
+                key={i}
+                onClick={() => {
+                  this.setState({
+                    current: i,
+                    type: v.type,
+                    title: v.title,
+                    list: [],
+                    pageNo: 1,
+                  }, () => {
+                    this.assistUnaudited();
+                    this.getPublicReleaseList();
+                  })
+                }}
               >
-                {
-                  this.state.current === 3 &&
-                  <View className='navs'>
-                    {
-                      this.state.sonTypes.map((it) =>
-                        <View className={this.state.selcotype == it.value ? 'nitems' : 'nitem'}
-                          key={it.value}
-                          onClick={() => {
-                            this.setState({
-                              list: [],
-                              pageNo: 1,
-                              selcotype: it.value,
-                            }, () => {
-                              this.getPublicReleaseList();
-                            })
-                          }}
-                        >{it.lable}</View>
-                      )
-                    }
-                  </View>
-                }
-                <MyList
-                  type={item.type}
-                  title={item.title}
-                  sonType={this.state.selcotype}
-                  typelist={this.state.typeList}
-                  seeView={this.state.current}
-                  list={this.state.list}
-                  listState={this.state.listState}
-                  onRefresh={() => {
-                    this.getPublicReleaseList(true);
-                  }}
-                  opens={e => {
+                {v.title}
+                {v.num > 0 && <View className='tips'></View>}
+              </View>
+            )
+          }
+        </View>
+        {
+          this.state.current === 3 &&
+          <View className='navs'>
+            {
+              this.state.sonTypes.map((it) =>
+                <View className={this.state.selcotype == it.value ? 'nitems' : 'nitem'}
+                  key={it.value}
+                  onClick={() => {
                     this.setState({
-                      id: e,
-                      isOpen: true,
+                      list: [],
+                      pageNo: 1,
+                      selcotype: it.value,
+                    }, () => {
+                      this.getPublicReleaseList();
                     })
                   }}
-                />
-              </AtTabsPane>
-            )
-          }
-        </AtTabs>
+                >{it.lable}</View>
+              )
+            }
+          </View>
+        }
+        <MyList
+          type={this.state.type}
+          title={this.state.title}
+          sonType={this.state.selcotype}
+          typelist={this.state.typeList}
+          seeView={this.state.current}
+          list={this.state.list}
+          listState={this.state.listState}
+          onRefresh={() => {
+            this.getPublicReleaseList(true);
+          }}
+          opens={e => {
+            this.setState({
+              id: e,
+              isOpen: true,
+            })
+          }}
+          opinion={(t, e) => {
+            this.publicAssistAdviceList(t, e)
+            this.setState({
+              id: e.id,
+            });
+          }}
+        />
         <timePicker
           config={{
             endDate: true,
@@ -492,6 +586,68 @@ class Examine extends Component {
             </AtModalAction>
           </AtModal>
         }
+        {/* 填写协单意见 */}
+        {
+          this.state.isOpinion &&
+          <AtModal
+            isOpened={this.state.isOpinion}
+          >
+            <AtModalHeader>公出企业-协单意见</AtModalHeader>
+            <AtModalContent>
+              <View style={{ margin: "0 0 10px", color: "#6190E8" }}>{this.state.info.userNames}</View>
+              {
+                this.state.isFill &&
+                <AtTextarea
+                  value={this.state.remarks}
+                  onChange={e => {
+                    this.setState({ remarks: e })
+                  }}
+                  maxLength={200}
+                  placeholder='请填写协单意见~'
+                />
+              }
+              <View className='historicalClock'>
+                {
+                  this.state.opinion.length > 0
+                    ? this.state.opinion.map(item =>
+                      <View key={item.id} className='item'>
+                        <View className='head'>
+                          <View className='spot' />
+                          <View className='clockTime' style={{ color: "#6190E8" }}>
+                            {item.aname}
+                          </View>
+                        </View>
+                        <View className='clockContent'>
+                          <View className='verticalLine' />
+                          <View className='rightContent'>
+                            <View className='contentItem'>
+                              <AtIcon className='atIcon' value='clock' size='15' color='#999999' />
+                              操作时间:{item.createTime}
+                            </View>
+                            <View className='contentItem'>
+                              <AtIcon className='atIcon' value='message' size='15' color='#999999' />
+                              评价:{item.remarks || "暂无"}
+                            </View>
+                          </View>
+                        </View>
+                      </View>
+                    )
+                    : <View style={{ textAlign: "center" }}>暂无协单意见</View>
+                }
+              </View>
+            </AtModalContent>
+            {
+              this.state.isFill
+                ? <AtModalAction>
+                  <Button type='secondary' onClick={() => { this.setState({ isOpinion: false }) }}>取消</Button>
+                  <Button type='primary' onClick={this.onOpinion.bind(this)}>确定</Button>
+                </AtModalAction>
+                : <AtModalAction>
+                  <Button type='secondary' onClick={() => { this.setState({ isOpinion: false }) }}>确定</Button>
+                </AtModalAction>
+            }
+          </AtModal>
+        }
       </View>
     )
   }

+ 83 - 4
src/pages/examine/index.less

@@ -257,9 +257,23 @@
             top: 0px;
             border-bottom-left-radius: 100px;
             border-top-left-radius: 100px;
-            padding: 20px 20px;
+            padding: 15px;
             color: white;
             background: rgba(22, 155, 213, 1);
+            z-index: 99;
+
+          }
+
+          .select {
+            position: absolute;
+            right: -31px;
+            top: 145px;
+            border-bottom-left-radius: 100px;
+            border-top-left-radius: 100px;
+            padding: 15px;
+            color: white;
+            background: rgba(22, 155, 213, 1);
+            z-index: 99;
 
           }
 
@@ -279,14 +293,14 @@
             position: absolute;
             border-bottom-left-radius: 100px;
             border-top-left-radius: 100px;
-            padding: 20px 20px;
+            padding: 15px;
             background: #f1662f;
             color: white;
             display: flex;
             justify-content: center;
             align-items: center;
             right: -31px;
-            top: -10px;
+            top: -20px;
           }
         }
 
@@ -306,9 +320,10 @@
           padding-bottom: 15px;
         }
 
-        .examine{
+        .examine {
           text-align: right;
           font-size: 25px;
+          margin-top: 10px;
         }
 
         .bottomContent {
@@ -362,4 +377,68 @@
 
   }
 
+}
+
+.tab {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: space-between;
+  text-align: center;
+  background-color: #FFF;
+
+  .titem {
+    position: relative;
+    -webkit-flex: 1;
+    -ms-flex: 1;
+    flex: 1;
+    padding: 24px 24px;
+    color: #333;
+    font-size: 28px;
+    -o-text-overflow: ellipsis;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    border-bottom: 1px solid transparent;
+
+  }
+
+  .titems {
+    position: relative;
+    -webkit-flex: 1;
+    -ms-flex: 1;
+    flex: 1;
+    padding: 24px 24px;
+    color: #6190E8;
+    border-bottom: 1px solid #6190E8;
+    font-size: 28px;
+    -o-text-overflow: ellipsis;
+    text-overflow: ellipsis;
+    overflow: hidden;
+
+  }
+
+  .tips {
+    position: absolute;
+    width: 20px;
+    height: 20px;
+    border-radius: 50%;
+    background: red;
+    top: 10px;
+    right: 10px;
+
+  }
+}
+
+.stitle {
+  text-align: center;
+  margin-bottom: 20px;
+}
+
+.sitem {
+  font-size: 24px;
+}
+
+.slit {
+  margin-top: 15px;
+  font-size: 20px;
 }

+ 68 - 17
src/pages/examine/myList.jsx

@@ -13,7 +13,6 @@ class MyList extends Component {
   }
 
   render() {
-    let seeView = this.props.seeView;
     const { title, sonType } = this.props
     return (
       <View className="indexPage">
@@ -66,7 +65,19 @@ class MyList extends Component {
                     </View>
                   }
                   {
-                    (title == "我的协单" || title === "查看协单") &&
+                    (title == "我的公出" || title == "我的协单" || title === "协单审核") &&
+                    <View
+                      className="select"
+                      onClick={e => {
+                        e.stopPropagation();
+                        this.props.opinion(title, v)
+                      }}
+                    >
+                      协单意见
+                    </View>
+                  }
+                  {
+                    (title == "我的协单" || title === "协单审核") &&
                     v.status === 2 &&
                     v.type === 3 &&
                     <View
@@ -79,6 +90,18 @@ class MyList extends Component {
                       驳回协单
                     </View>
                   }
+                  {/* {
+                    title === "协单审核" &&
+                    <View
+                      className="select"
+                      onClick={e => {
+                        e.stopPropagation();
+                        this.props.onSelect(v)
+                      }}
+                    >
+                      查看协单意见
+                    </View>
+                  } */}
                 </View>
                 <View className="userName">
                   <View className="uNtext">
@@ -87,20 +110,48 @@ class MyList extends Component {
                 </View>
                 <View className="releaseStarts">
                   开始时间:{v.releaseStarts}
-                  {this.props.type === 0 && v.status !== 3 ? (
-                    <View
-                      className="punchClock"
-                      onClick={(e) => {
-                        e.stopPropagation();
-                        Taro.eventCenter.trigger("GoPunchIn", v);
-                        Taro.switchTab({
-                          url: "/pages/punchClock/index",
-                        });
-                      }}
-                    >
-                      {(v.clockIn === 1 || v.clockIn === 2) ? "更新打卡" : "去打卡"}
-                    </View>
-                  ) : null}
+                  {/* this.props.type === 0 &&  */}
+                  {this.props.type === 0 && v.status === 2 && (
+                    v.type === 3
+                      ? v.publicAssistAdvice > 0
+                        ? <View
+                          className="punchClock"
+                          onClick={(e) => {
+                            e.stopPropagation();
+                            Taro.eventCenter.trigger("GoPunchIn", v);
+                            Taro.switchTab({
+                              url: "/pages/punchClock/index",
+                            });
+                          }}
+                        >
+                          {(v.clockIn === 1 || v.clockIn === 2) ? "更新打卡" : "去打卡"}
+                        </View>
+                        : null
+                      : <View
+                        className="punchClock"
+                        onClick={(e) => {
+                          e.stopPropagation();
+                          Taro.eventCenter.trigger("GoPunchIn", v);
+                          Taro.switchTab({
+                            url: "/pages/punchClock/index",
+                          });
+                        }}
+                      >
+                        {(v.clockIn === 1 || v.clockIn === 2) ? "更新打卡" : "去打卡"}
+                      </View>
+                  )}
+                  {/* {(v.type === 3 && v.publicAssistAdvice === 0) ? null : (v.status === 2 &&)(<View
+                    className="punchClock"
+                    onClick={(e) => {
+                      e.stopPropagation();
+                      Taro.eventCenter.trigger("GoPunchIn", v);
+                      Taro.switchTab({
+                        url: "/pages/punchClock/index",
+                      });
+                    }}
+                  >
+                    {(v.clockIn === 1 || v.clockIn === 2) ? "更新打卡" : "去打卡"}
+                  </View>)} */}
                 </View>
                 <View className="releaseEnds">
                   结束时间:{v.releaseEnds}
@@ -139,7 +190,7 @@ class MyList extends Component {
             }}
           />
         </View>
-      </View>
+      </View >
     );
   }
 }

+ 8 - 3
src/pages/login/index.jsx

@@ -53,7 +53,9 @@ class Login extends Component {
   }
 
   componentDidShow() {
-
+    Taro.showShareMenu({
+      withShareTicket: true
+    })
   }
 
   componentDidMount() {
@@ -70,7 +72,10 @@ class Login extends Component {
       success: (res) => {
         //console.log(res.subscriptionsSetting,'res.subscriptionsSetting')
         if (res.subscriptionsSetting.mainSwitch) {
-          if (res.subscriptionsSetting['j7WH3EwQnxGxwuV2HwmJhryxySPE8vOiV5cVOpp-42I'] === "reject" || res.subscriptionsSetting['pWia-KJPFwDM8ReDu_BOa9FJn31VFc81bp3yxfBmIRI'] === "reject" || res.subscriptionsSetting['vo28uzT2sLS-9ioroNyZbMSvu0mMvf6le2pDZVN891U'] === "reject") {
+          if (
+            res.subscriptionsSetting['j7WH3EwQnxGxwuV2HwmJhryxySPE8vOiV5cVOpp-42I'] === "reject" ||
+            res.subscriptionsSetting['pWia-KJPFwDM8ReDu_BOa9FJn31VFc81bp3yxfBmIRI'] === "reject" ||
+            res.subscriptionsSetting['UGlNqF1VQsxYh6iVKrDuw_EkhrDNU6TXv4snGw4xze8'] === "reject") {
             this.setState({
               isOpened: true,
               loading: false,
@@ -82,7 +87,7 @@ class Login extends Component {
             tmplIds: [
               'pWia-KJPFwDM8ReDu_BOa9FJn31VFc81bp3yxfBmIRI',
               'j7WH3EwQnxGxwuV2HwmJhryxySPE8vOiV5cVOpp-42I',
-              'vo28uzT2sLS-9ioroNyZbMSvu0mMvf6le2pDZVN891U'
+              'UGlNqF1VQsxYh6iVKrDuw_EkhrDNU6TXv4snGw4xze8'
             ], //此处写在后台获取的模板ID,可以写多个模板ID,看自己的需求
             success: function (s) {
               _this.setState({

+ 134 - 3
src/pages/mybusiness/index.jsx

@@ -1,7 +1,13 @@
 import React, { Component } from 'react';
 import Taro from '@tarojs/taro';
 import { View, Picker, ScrollView, Button } from '@tarojs/components'
-import { getPublicReleaseList, techReject, getReleasetDails } from '../../utils/servers/servers';
+import {
+  getPublicReleaseList,
+  techReject,
+  getReleasetDails,
+  publicAssistAdvice,
+  publicAssistAdviceList
+} from '../../utils/servers/servers';
 import dayjs from 'dayjs';
 import {
   AtSearchBar,
@@ -9,9 +15,10 @@ import {
   AtTabsPane,
   AtIcon,
   AtModal,
+  AtModalHeader,
   AtModalContent,
   AtModalAction,
-  AtTextarea
+  AtTextarea,
 } from 'taro-ui';
 import { clockState } from '../../utils/tools/config';
 
@@ -21,7 +28,6 @@ import "taro-ui/dist/style/components/flex.scss";
 import "taro-ui/dist/style/components/action-sheet.scss";
 import "taro-ui/dist/style/components/icon.scss";
 import "taro-ui/dist/style/components/list.scss";
-import "taro-ui/dist/style/components/icon.scss";
 import "taro-ui/dist/style/components/modal.scss";
 
 import MyList from '../examine/myList';
@@ -58,6 +64,9 @@ class Examine extends Component {
         { title: '技术协单', type: 2 },
         { title: '全部', type: 4 }],
       selcotype: 4,
+      isOpinion: false,
+      opinion: [],
+      isFill: true,
 
     }
     this.getPublicReleaseList = this.getPublicReleaseList.bind(this);
@@ -259,6 +268,60 @@ class Examine extends Component {
     })
   }
 
+  onOpinion() {
+    if (!this.state.remarks) {
+      Taro.showToast({ title: '请填写协单意见!', icon: 'none' });
+      return
+    }
+    Taro.showLoading({ title: '正在提交...' });
+    publicAssistAdvice({
+      prid: this.state.id,
+      remarks: this.state.remarks,
+    }).then(v => {
+      Taro.hideLoading()
+      if (v.error.length === 0) {
+        Taro.showToast({ title: '填写成功', icon: 'none' });
+        this.getPublicReleaseList();
+        this.setState({
+          isOpinion: false,
+          remarks: "",
+        })
+      } else {
+        Taro.showToast({ title: v.error[0].message, icon: 'none' })
+      }
+    }).catch(() => {
+      Taro.hideLoading()
+      Taro.showToast({
+        title: '系统错误,请稍后再试',
+        icon: 'none'
+      })
+    })
+  }
+
+  publicAssistAdviceList(t, obj) {
+    publicAssistAdviceList({
+      id: obj.id,
+      type: t == "我的公出" ? 1 : 0,
+    }).then(v => {
+      if (v.error.length === 0) {
+        this.setState({
+          info: obj,
+          opinion: v.data,
+          isOpinion: true,
+          isFill: t == "我的协单" ? true : false
+        })
+      } else {
+        Taro.showToast({ title: v.error[0].message, icon: 'none' })
+      }
+    }).catch(() => {
+      Taro.hideLoading()
+      Taro.showToast({
+        title: '系统错误,请稍后再试',
+        icon: 'none'
+      })
+    })
+  }
+
   render() {
     return (
       <View className='indexPage' >
@@ -486,6 +549,12 @@ class Examine extends Component {
                       },
                     });
                   }}
+                  opinion={(t, e) => {
+                    this.publicAssistAdviceList(t, e)
+                    this.setState({
+                      id: e.id,
+                    });
+                  }}
                 />
               </AtTabsPane>
             )
@@ -600,6 +669,68 @@ class Examine extends Component {
             </AtModalContent>
           </AtModal>
         }
+        {/* 填写协单意见 */}
+        {
+          this.state.isOpinion &&
+          <AtModal
+            isOpened={this.state.isOpinion}
+          >
+            <AtModalHeader>公出企业-协单意见</AtModalHeader>
+            <AtModalContent>
+              <View style={{ margin: "0 0 10px", color: "#6190E8" }}>{this.state.info.userNames}</View>
+              {
+                this.state.isFill &&
+                <AtTextarea
+                  value={this.state.remarks}
+                  onChange={e => {
+                    this.setState({ remarks: e })
+                  }}
+                  maxLength={200}
+                  placeholder='请填写协单意见~'
+                />
+              }
+              <View className='historicalClock'>
+                {
+                  this.state.opinion.length > 0
+                    ? this.state.opinion.map(item =>
+                      <View key={item.id} className='item'>
+                        <View className='head'>
+                          <View className='spot' />
+                          <View className='clockTime' style={{ color: "#6190E8" }}>
+                            {item.aname}
+                          </View>
+                        </View>
+                        <View className='clockContent'>
+                          <View className='verticalLine' />
+                          <View className='rightContent'>
+                            <View className='contentItem'>
+                              <AtIcon className='atIcon' value='clock' size='15' color='#999999' />
+                              操作时间:{item.createTime}
+                            </View>
+                            <View className='contentItem'>
+                              <AtIcon className='atIcon' value='message' size='15' color='#999999' />
+                              评价:{item.remarks || "暂无"}
+                            </View>
+                          </View>
+                        </View>
+                      </View>
+                    )
+                    : <View style={{ textAlign: "center" }}>暂无协单意见</View>
+                }
+              </View>
+            </AtModalContent>
+            {
+              this.state.isFill
+                ? <AtModalAction>
+                  <Button type='secondary' onClick={() => { this.setState({ isOpinion: false }) }}>取消</Button>
+                  <Button type='primary' onClick={this.onOpinion.bind(this)}>确定</Button>
+                </AtModalAction>
+                : <AtModalAction>
+                  <Button type='secondary' onClick={() => { this.setState({ isOpinion: false }) }}>确定</Button>
+                </AtModalAction>
+            }
+          </AtModal>
+        }
       </View>
     )
   }

+ 58 - 2
src/pages/mybusiness/index.less

@@ -269,14 +269,14 @@
             position: absolute;
             border-bottom-left-radius: 100px;
             border-top-left-radius: 100px;
-            padding: 20px;
+            padding: 15px;
             background: #f1662f;
             color: white;
             display: flex;
             justify-content: center;
             align-items: center;
             right: -31px;
-            top: -10px;
+            top: -20px;
           }
         }
 
@@ -322,4 +322,60 @@
 
 .at-modal__container {
   width: 718px;
+}
+
+.historicalClock {
+  padding: 15px;
+
+  .item {
+    color: #999999;
+    padding-bottom: 15px;
+
+    .head {
+      display: flex;
+      flex-flow: row nowrap;
+      align-content: center;
+      padding-bottom: 15px;
+
+      .spot {
+        width: 30px;
+        height: 30px;
+        border-radius: 30px;
+        background: #999999;
+        margin-right: 20px;
+      }
+
+      .clockTime {
+        font-size: 23px;
+      }
+    }
+
+    .clockContent {
+      display: flex;
+      flex-flow: row nowrap;
+
+      .verticalLine {
+        border: 2px transparent solid;
+        margin-right: 30px;
+        margin-left: 15px;
+      }
+
+      .rightContent {
+        padding-top: 15px;
+
+        .contentItem {
+          font-size: 23px;
+          padding-bottom: 25px;
+
+          .atIcon {
+            margin-right: 5px;
+          }
+        }
+      }
+    }
+  }
+
+  .at-image-picker__remove-btn {
+    display: none;
+  }
 }

+ 4 - 1
src/pages/punchClock/index.jsx

@@ -18,6 +18,9 @@ class PunchClock extends Component {
   }
 
   componentDidShow() {
+    Taro.showShareMenu({
+      withShareTicket: true
+    })
     if (this.state.isHome) {
       Taro.eventCenter.trigger('punchClockComponentDidShow');
       //获取地区选定数据
@@ -101,7 +104,7 @@ class PunchClock extends Component {
           onClose={this.onClose}
           onCancel={this.onClose}
           onConfirm={this.handleConfirm}
-          content='您确定是否切换位置?切换位置,将重新提交“公出审核”,如您的公出审核已通过,则需再次审核。'
+          content='您确定是否切换位置?切换位置,将重新提交“公出审核”,如您的公出审核已通过,则需再次审核。'
         />
         <privacy />
       </>

+ 22 - 9
src/pages/punchClock/punchClocks.jsx

@@ -236,6 +236,16 @@ class PunchClocks extends Component {
   // 正常打卡
   publicReleaseClockIn(uid) {
     const { dtails } = this.state
+    if (dtails.status !== 2) {
+      Taro.hideLoading()
+      Taro.showToast({ title: '公出审核中,不可打卡', icon: 'none' });
+      return;
+    }
+    if (dtails.type === 3 && dtails.publicAssistAdvice === 0) {
+      Taro.hideLoading()
+      Taro.showToast({ title: '未填写协单意见,不可打卡', icon: 'none' });
+      return;
+    }
     if (dtails.status === 3) {
       Taro.hideLoading()
       Taro.showToast({ title: '申请已撤销,无法打卡', icon: 'none' });
@@ -631,21 +641,24 @@ class PunchClocks extends Component {
                         && this.state.distance <= this.wxConfig.clockInRange
                         && this.state.distance >= 0
                         && !(dayjs().isBefore(this.state.dtails.releaseStarts) || dayjs().isAfter(this.state.dtails.releaseEnds))
-                        && dtails.status !== 3
-                        ? ((newClockIn.status === 1 || newClockIn.status === 2) ? '1px 1px 15px 1px #3f82e8' : '1px 1px 15px 1px #72cb78')
+                        && dtails.status === 2
+                        ? dtails.type === 3
+                          ? dtails.publicAssistAdvice > 0
+                            ? ((newClockIn.status === 1 || newClockIn.status === 2) ? '1px 1px 15px 1px #3f82e8' : '1px 1px 15px 1px #72cb78')
+                            : '1px 1px 15px 1px #828e83'
+                          : ((newClockIn.status === 1 || newClockIn.status === 2) ? '1px 1px 15px 1px #3f82e8' : '1px 1px 15px 1px #72cb78')
                         : '1px 1px 15px 1px #828e83',
                     background:
-                      // (dtails.type == 1 && (dtails.techStartProcess == 1 || dtails.techStartProcess == 3))
-                      //   ? '#828e83'
-                      //   : (dtails.type == 0 && (dtails.publicType == 1 || dtails.publicType == 3))
-                      //     ? '#828e83'
-                      //     : 
                       (!isNaN(parseInt(this.state.distance)))
                         && this.state.distance <= this.wxConfig.clockInRange
                         && this.state.distance >= 0
                         && !(dayjs().isBefore(this.state.dtails.releaseStarts) || dayjs().isAfter(this.state.dtails.releaseEnds))
-                        && dtails.status !== 3
-                        ? ((newClockIn.status === 1 || newClockIn.status === 2) ? '#3f82e8' : '#72cb78')
+                        && dtails.status === 2
+                        ? dtails.type === 3
+                          ? dtails.publicAssistAdvice > 0
+                            ? ((newClockIn.status === 1 || newClockIn.status === 2) ? '#3f82e8' : '#72cb78')
+                            : '#828e83'
+                          : ((newClockIn.status === 1 || newClockIn.status === 2) ? '#3f82e8' : '#72cb78')
                         : '#828e83'
                   }}>
                   <View className='punchClockTitle'>

+ 6 - 0
src/pages/situation/index.config.js

@@ -0,0 +1,6 @@
+export default {
+  navigationBarTitleText: '公出情况',
+  usingComponents: {
+    timePicker: '../../components/common/timePicker/timePicker'
+  }
+}

+ 339 - 0
src/pages/situation/index.jsx

@@ -0,0 +1,339 @@
+import React, { Component } from "react";
+import { View, Image, Button, Text } from "@tarojs/components";
+import Taro, { getCurrentInstance } from "@tarojs/taro";
+import Skeleton from "taro-skeleton";
+import dayjs from 'dayjs';
+import {
+  AtIcon,
+  AtModal,
+  AtModalHeader,
+  AtModalContent,
+  AtModalAction,
+  AtTextarea
+} from 'taro-ui';
+import { getPublicList, limitUser, addSupplement } from "../../utils/servers/servers";
+import noData from '../../image/noData.png';
+import "./index.less";
+import "taro-ui/dist/style/components/flex.scss";
+import "taro-ui/dist/style/components/action-sheet.scss";
+import "taro-ui/dist/style/components/icon.scss";
+import "taro-ui/dist/style/components/list.scss";
+import "taro-ui/dist/style/components/modal.scss";
+import MessageNoticebar from "../../components/common/messageNoticebar";
+import { getContactType } from "../../utils/tools";
+import Superior from "../../components/common/superior";
+
+class CustomerProfile extends Component {
+  $instance = getCurrentInstance();
+
+  constructor(props) {
+    super(props);
+    this.state = {
+      data: [],
+      loading: false,
+      isOpen: false,
+      opinion: "",
+      type: 1,
+      id: "",
+      text: "",
+      myUser: -1,
+      isSuperior: false,
+    };
+    this.getPublicList = this.getPublicList.bind(this);
+    this.addSupplement = this.addSupplement.bind(this);
+  }
+
+  componentDidMount() {
+    this.getPublicList();
+  }
+
+  componentDidShow() {
+
+  }
+
+  getPublicList() {
+    this.setState({
+      loading: true
+    })
+    getPublicList({
+      id: this.$instance.router.params.id,
+    })
+      .then((v) => {
+        if (v.error.length === 0) {
+          this.setState({
+            data: v.data.list,
+            myUser: v.data.myUser,
+            loading: false,
+          })
+        } else {
+          Taro.showToast({ title: v.error[0].message, icon: "none" });
+        }
+      })
+      .catch((err) => {
+        this.setState({
+          loading: false
+        })
+        Taro.showToast({ title: "系统错误,请稍后再试", icon: "none" });
+      });
+  }
+
+  limitUser() {
+    limitUser({
+      uid: this.$instance.router.params.id,
+      // hours: 1,
+    }).then((v) => {
+      if (v.error.length === 0) {
+
+      } else {
+        Taro.showToast({
+          title: v.error[0].message,
+          icon: "none",
+        });
+      }
+    }).catch(() => {
+
+    })
+  }
+
+  onShareAppMessage() {
+    this.limitUser();
+    return {
+      title: "面谈记录",
+      path: "pages/situation/index?id=" + this.$instance.router.params.id + "&signBills=" + this.$instance.router.params.signBills + "&nickname=" + this.$instance.router.params.nickname,
+    };
+  }
+
+  // 公出补充
+  addSupplement() {
+    const { type, id, opinion, text } = this.state
+    let obj = {}
+    if (type == 1) {
+      obj = {
+        id,
+        supplement: (opinion ? opinion + "/" : "") + text
+      }
+    } else if (type == 2) {
+      obj = {
+        id,
+        nextPlan: (opinion ? opinion + "/" : "") + text
+      }
+    }
+    addSupplement(obj).then((v) => {
+      if (v.error.length === 0) {
+        Taro.showToast({
+          title: "填写成功",
+        });
+        this.setState({
+          isOpen: false,
+          id: "",
+          text: "",
+        })
+        this.getPublicList();
+      } else {
+        Taro.showToast({
+          title: v.error[0].message,
+          icon: "none",
+        });
+      }
+    }).catch(() => {
+
+    })
+  }
+
+  render() {
+    const { data, loading, type, opinion, myUser } = this.state;
+    return (
+      <View className="situation">
+        <MessageNoticebar />
+        <View
+          className="titleContent"
+        >
+          {data && data.length === 0 ? (
+            <Skeleton
+              title
+              row={3}
+              animateName="elastic"
+              avatarShape="square"
+              loading={loading}
+            >
+              <View className='noData'>
+                <Image src={noData} className='noDataImg' />
+                <View className='noDataTitle'>暂无公出情况</View>
+              </View>
+            </Skeleton>
+          ) : (
+            <View>
+              <View className="UserName">
+                <Text style={{ width: "80%" }}>
+                  <Text>{this.$instance.router.params.nickname}&nbsp;&nbsp;</Text>
+                  <Text style={{ fontSize: "12px", color: ["red", "green"][this.$instance.router.params.signBills] }}>{["未签单", "已签单"][this.$instance.router.params.signBills]}</Text>
+                </Text>
+                {myUser == 1 && <Button className="share" plain type='primary' open-type="share">分享</Button>}
+              </View>
+              <View className="button">
+                <View className="but"
+                  onClick={e => {
+                    e.stopPropagation()
+                    this.setState({
+                      isSuperior: true
+                    })
+                  }}
+                >上级指导</View>
+                {
+                  this.state.isSuperior &&
+                  <Superior
+                    id={this.$instance.router.params.id}
+                    userNames={this.$instance.router.params.nickname}
+                    isOpinion={this.state.isSuperior}
+                    isFill={myUser == 0}
+                    onClose={() => {
+                      this.setState({
+                        isSuperior: false
+                      })
+                    }}
+                  />
+                }
+                <View className="but"
+                  onClick={e => {
+                    e.stopPropagation()
+                    Taro.navigateTo({
+                      url: "/pages/customerProfile/index?id=" + this.$instance.router.params.id + "&signBills=" + this.$instance.router.params.signBills,
+                    });
+                  }}
+                >客户档案</View>
+              </View>
+              {
+                data.map(item =>
+                  <View className="content" key={item.prdId}>
+                    <View className="citem">
+                      <Text className="ctxt">跟进方式</Text>
+                      <Text className="ctxt">跟进人</Text>
+                      <Text className="ctxt" style={{ width: "40%" }}>跟进时间</Text>
+                      <Text className="ctxt" style={{ width: "10%" }}>次数</Text>
+                    </View>
+                    <View className="citems">
+                      <Text className="ctxt">{getContactType(item.contactType)}</Text>
+                      <Text className="ctxt">{item.followName}</Text>
+                      <Text className="ctxt" style={{ width: "40%" }}>{!!item.followTime && dayjs(item.followTime).format('YYYY-MM-DD HH:mm')}</Text>
+                      <Text className="ctxt" style={{ width: "10%" }}>{item.followCount}</Text>
+                    </View>
+                    {/* <View className="val">跟进方式:<Text className="t">{getContactType(item.contactType)}</Text></View>
+                    <View className="val">跟进人:<Text className="t">{item.followName}</Text></View>
+                    <View className="val">跟进部门:<Text className="t">{item.followDep}</Text></View>
+                    <View className="val">跟进说明:<Text className="t">{item.result}</Text></View>
+                    <View className="val">跟进时间:<Text className="t">{item.followTime}</Text></View>
+                    <View className="val">跟进次数:<Text className="t">{item.followCount}</Text></View> */}
+                    <View className="val">跟进部门:<Text className="t">{item.followDep}</Text></View>
+                    <View className="val">跟进说明:<Text className="t">{item.result}</Text></View>
+                    <View className="val">公出时间:<Text className="t">{item.releaseStarts}</Text></View>
+                    <View className="val">公出人:<Text className="t">{item.aname}</Text></View>
+                    <View className="val">公出目标:<Text className="t">{item.remarks}</Text></View>
+                    <View className="val">公出计划:<Text className="t">{item.plan}</Text></View>
+                    <View className="val">预计效果:<Text className="t">{item.expectedEffect}</Text></View>
+                    <View className="tit">
+                      <Text style={{ width: "80%" }}>
+                        本次公出目标总结
+                        <Text className="txt">(包括后续面谈时间、内容、沟通对象、沟通结果)</Text>
+                      </Text>
+                      {
+                        myUser == 1 &&
+                        <View className="bt"
+                          onClick={e => {
+                            e.stopPropagation()
+                            this.setState({
+                              type: 1,
+                              id: item.prdId,
+                              opinion: item.supplement,
+                              isOpen: true,
+                            })
+                          }}
+                        >填写</View>
+                      }
+                    </View>
+                    <View className="val" style={{ fontWeight: 400 }}>{item.supplement || "无"}</View>
+                    <View className="tit">
+                      <Text>
+                        下一步公出计划
+                        <Text className="txt">(下一步公出计划)</Text>
+                      </Text>
+                      {
+                        myUser == 1 &&
+                        <View className="bt"
+                          onClick={e => {
+                            e.stopPropagation()
+                            this.setState({
+                              type: 2,
+                              id: item.prdId,
+                              opinion: item.nextPlan,
+                              isOpen: true,
+                            })
+                          }}
+                        >填写</View>
+                      }
+                    </View>
+                    <View className="val" style={{ fontWeight: 400 }}>{item.nextPlan || "无"}</View>
+                  </View>
+                )
+              }
+            </View>
+          )}
+        </View>
+
+        {
+          this.state.isOpen &&
+          <AtModal
+            isOpened={this.state.isOpen}
+          >
+            <AtModalHeader>公出企业-{type == 1 ? "本次共出目标" : type == 2 ? "下一步公出计划" : ""}</AtModalHeader>
+            <AtModalContent>
+              <View style={{ margin: "0 0 10px", color: "#6190E8" }}>{this.$instance.router.params.nickname}</View>
+              <AtTextarea
+                value={this.state.text}
+                onChange={e => {
+                  this.setState({ text: e })
+                }}
+                maxLength={200}
+                placeholder={type == 1
+                  ? '请填写本次公出目标总结,包括后续面谈时间、内容、沟通对象、沟通结果等内容' : type == 2
+                    ? "请填写下一步公出计划" : ""}
+              />
+
+              <View className='historicalClock' style={{ marginTop: "15px" }}>
+                {
+                  !!opinion
+                    ? opinion.split("/").map(item =>
+                      <View key={item.id} className='item'>
+                        {/* <View className='head'>
+                          <View className='spot' />
+                          <View className='clockTime' style={{ color: "#6190E8" }}>
+
+                          </View>
+                        </View> */}
+                        <View className='clockContent' style={{ borderTop: "1px solid #999999" }}>
+                          {/* <View className='verticalLine' /> */}
+                          <View className='rightContent'>
+                            <View className='contentItem' style={{ paddingBottom: "0px" }}>
+                              <AtIcon className='atIcon' value='message' size='15' color='#999999' />
+                              {item || "暂无"}
+                            </View>
+                          </View>
+                        </View>
+                      </View>
+                    )
+                    : <View style={{ textAlign: "center" }}>暂无信息</View>
+                }
+              </View>
+            </AtModalContent>
+            <AtModalAction>
+              <Button type='secondary' onClick={() => { this.setState({ isOpen: false }) }}>取消</Button>
+              <Button type='primary' onClick={this.addSupplement.bind(this)}>确定</Button>
+            </AtModalAction>
+          </AtModal>
+        }
+
+      </View>
+    );
+  }
+}
+
+export default CustomerProfile;

+ 169 - 0
src/pages/situation/index.less

@@ -0,0 +1,169 @@
+.situation {
+  min-height: calc(100vh - 30px);
+  background: #F5F5F5;
+  padding-bottom: 30px;
+
+  .titleContent {
+    position: relative;
+    // padding: 20px 0;
+
+    .noData {
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      flex-flow: column nowrap;
+      padding-top: 100px;
+
+      .noDataImg {
+        width: 200px;
+        height: 200px;
+      }
+
+      .noDataTitle {
+        color: #969696;
+        padding: 20px 0 100px 0;
+      }
+    }
+
+    .content {
+      margin-bottom: 20px;
+      padding: 20px 30px;
+      background: white;
+      // border-bottom: 1px #dadada solid;
+
+      .name {
+        color: #1E90FF;
+        font-weight: bolder;
+        padding-bottom: 10px;
+
+      }
+
+      .title {
+        font-weight: bolder;
+        margin: 50px 0 10px 0;
+      }
+
+      .tit {
+        display: flex;
+        flex-direction: row;
+        align-items: baseline;
+        justify-content: space-between;
+        font-size: 26px;
+        font-weight: bolder;
+        margin-top: 15px;
+        margin-bottom: 5px;
+
+        .txt {
+          color: red;
+          font-weight: 400;
+          font-size: 20px;
+        }
+
+        .bt {
+          background: #70B603;
+          color: #FFFFFF;
+          padding: 10px 20px;
+          font-size: 26px;
+          border-radius: 8px;
+          font-weight: 400;
+        }
+
+      }
+
+      .val {
+        font-size: 26px;
+        font-weight: bolder;
+
+        .t {
+          font-weight: 400;
+        }
+
+        .num {
+          font-weight: bolder;
+          color: #1E90FF;
+        }
+
+      }
+
+      .citem {
+        display: flex;
+        flex-direction: row;
+        align-items: center;
+        justify-content: space-between;
+        font-size: 24px;
+        margin-bottom: 15px;
+
+        .ctxt {
+          width: 25%;
+        }
+
+      }
+
+      .citems {
+        display: flex;
+        flex-direction: row;
+        align-items: center;
+        justify-content: space-between;
+        font-size: 24px;
+        margin-bottom: 15px;
+        background: #81D3F8;
+        border-radius: 8px;
+        padding: 15px 0;
+        min-height: 30px;
+
+        .ctxt {
+          width: 25%;
+        }
+
+      }
+
+    }
+
+  }
+}
+
+.UserName {
+  font-size: 32px;
+  color: #1E90FF;
+  font-weight: bolder;
+  padding-bottom: 10px;
+  display: flex;
+  flex-direction: row;
+  flex-wrap: wrap;
+  align-items: flex-start;
+  justify-content: space-between;
+
+  background: white;
+  padding: 20px 20px;
+  margin-bottom: 20px;
+
+  .share {
+    margin: 0;
+    padding: 0;
+    font-size: 26px;
+    line-height: 24px;
+    color: #1E90FF;
+    padding: 10px 30px;
+    border: 1px solid #1E90FF;
+    border-radius: 30px;
+  }
+
+}
+
+.button {
+  display: flex;
+  flex-direction: row-reverse;
+  padding: 20px 20px 0;
+  background: white;
+
+  .but {
+    background: #1E90FF;
+    padding: 10px 15px;
+    color: #FFFFFF;
+    font-size: 26px;
+    border-radius: 8px;
+    margin-left: 20px;
+
+  }
+
+}

+ 2 - 2
src/utils/config.js

@@ -1,7 +1,7 @@
 // 本地
-export const resourceAddress = 'http://172.16.1.199/:3000/upload;'
+// export const resourceAddress = 'http://172.16.1.199/:3000/upload;'
 // 生产
 // export const resourceAddress = 'https://s.jishutao.com/upload';
 // 测试
-// export const resourceAddress = 'https://static.jishutao.com/upload';
+export const resourceAddress = 'https://static.jishutao.com/upload';
 

+ 2 - 2
src/utils/servers/baseUrl.js

@@ -7,8 +7,8 @@ const getBaseUrl = (url) => {
     BASE_URL = 'https://bm.jishutao.com'
   } else {
     // 生产环境
-    BASE_URL = 'http://172.16.1.199:8080'
-    // BASE_URL = 'https://uat.jishutao.com'
+    // BASE_URL = 'http://172.16.1.199:8080'
+    BASE_URL = 'https://uat.jishutao.com'
     // BASE_URL = 'https://bm.jishutao.com'
   }
   return BASE_URL

+ 85 - 2
src/utils/servers/servers.js

@@ -66,7 +66,10 @@ export const publicReleaseClockIn = (postData = {}) => {
 
 // 公出审批
 export const examinePublicRelease = (isSuperior = 1, postData = {}) => {
-  return HTTPREQUEST.post(isSuperior == 1 ? '/api/admin/release/examinePublicRelease' : isSuperior == 2 ? '/api/admin/release/marketersExamine' : '/api/admin/release/techExamine', postData)
+  return HTTPREQUEST.post(isSuperior == 1
+    ? '/api/admin/release/examinePublicRelease' : isSuperior == 2
+      ? '/api/admin/release/marketersExamine' : isSuperior == 3
+        ? '/api/admin/release/techExamine' : isSuperior == 4 && '/api/admin/release/assistExamine', postData)
 }
 
 //获取外出公出详情
@@ -137,4 +140,84 @@ export const checkOrderNoDuration = (postData = {}) => {
 // 限定项目客户情况
 export const getRestrictProjectUser = (postData = {}) => {
   return HTTPREQUEST.get('/api/restrict/Project/getRestrictProjectUser', postData)
-}
+}
+
+// 未审核查询
+export const getAssistUnaudited = (postData = {}) => {
+  return HTTPREQUEST.get('/api/admin/release/unaudited', postData)
+}
+
+// 新增意见协单
+export const publicAssistAdvice = (postData = {}) => {
+  return HTTPREQUEST.post('/api/admin/publicAssistAdvice/add', postData)
+}
+
+// 查看协单公出意见
+export const publicAssistAdviceList = (postData = {}) => {
+  return HTTPREQUEST.get('/api/admin/publicAssistAdvice/list', postData)
+}
+
+// 获取我的客户列表
+export const selectMyUser = (postData = {}) => {
+  return HTTPREQUEST.get('/api/admin/customer/selectMyUser', postData)
+}
+
+// 客户信息详情
+export const selectMyUserDetails = (postData = {}) => {
+  return HTTPREQUEST.get('/api/admin/customer/selectMyUserDetails', postData)
+}
+
+// 客户档案详情
+export const queryByUidAll = (postData = {}) => {
+  return HTTPREQUEST.get('/api/admin/userArchives/queryByUidAll', postData)
+}
+
+// 企业公出情况
+export const getPublicList = (postData = {}) => {
+  return HTTPREQUEST.get('/api/admin/customer/getPublicReleaseList', postData)
+}
+
+// 修改客户信息
+export const updateUserDate = (type = 0, postData = {}) => {
+  return HTTPREQUEST.post((type == 0 || type == 5) ? '/api/admin/customer/updateUserDate' : '/api/admin/userArchives/update', postData)
+}
+
+// 新增联系人
+export const addOneContact = (postData = {}) => {
+  return HTTPREQUEST.post('/api/admin/customer/addOneContact', postData)
+}
+
+// 联系人列表
+export const findCustomerContacts = (postData = {}) => {
+  return HTTPREQUEST.get('/api/admin/customer/findCustomerContacts', postData)
+}
+
+// 主联系人设置
+export const updateMainContact = (postData = {}) => {
+  return HTTPREQUEST.get('/api/admin/customer/updateMainContact', postData)
+}
+
+// 分享限时查询
+export const limitUser = (postData = {}) => {
+  return HTTPREQUEST.post('/api/admin/release/limitUser', postData)
+}
+
+// 项目列表
+export const getBusinessProjectByName = (postData = {}) => {
+  return HTTPREQUEST.get('/api/admin/order/getBusinessProjectByName', postData)
+}
+
+// 公出补充
+export const addSupplement = (postData = {}) => {
+  return HTTPREQUEST.post('/api/admin/release/addSupplement', postData)
+}
+
+// 上级评价详情
+export const getUserSuperEvaluate = (postData = {}) => {
+  return HTTPREQUEST.get('/api/admin/userSuperEvaluate/list', postData)
+}
+
+// 上级填写评价
+export const addUserSuperEvaluate = (postData = {}) => {
+  return HTTPREQUEST.post('/api/admin/userSuperEvaluate/add', postData)
+}

+ 171 - 33
src/utils/tools/config.js

@@ -1,62 +1,200 @@
 //详情申请状态
 export const clockState = [
   {
-    title:'驳回',
-    id:0,
-    color:'#f31212'
+    title: '驳回',
+    id: 0,
+    color: '#f31212'
   },
   {
-    title:'审核中',
-    id:1,
-    color:'#1d4fea'
+    title: '审核中',
+    id: 1,
+    color: '#1d4fea'
   },
   {
-    title:'通过',
-    id:2,
-    color:'#34de38'
+    title: '通过',
+    id: 2,
+    color: '#34de38'
   },
   {
-    title:'已撤销',
-    id:3,
-    color:'#242424'
+    title: '已撤销',
+    id: 3,
+    color: '#242424'
   },
   {
-    title:'技术驳回',
-    id:4,
-    color:'#f31212'
+    title: '技术驳回',
+    id: 4,
+    color: '#f31212'
   },
 ];
 
 //申请日志状态
 export const clockJournalState = [
   {
-    title:'驳回',
-    id:0,
-    color:'#f31212'
+    title: '驳回',
+    id: 0,
+    color: '#f31212'
   },
   {
-    title:'发起',
-    id:1,
-    color:'#1d4fea'
+    title: '发起',
+    id: 1,
+    color: '#1d4fea'
   },
   {
-    title:'通过',
-    id:2,
-    color:'#34de38'
+    title: '通过',
+    id: 2,
+    color: '#34de38'
   },
   {
-    title:'已打卡',
-    id:3,
-    color:'#b934de'
+    title: '已打卡',
+    id: 3,
+    color: '#b934de'
   },
   {
-    title:'已撤销',
-    id:4,
-    color:'#242424'
+    title: '已撤销',
+    id: 4,
+    color: '#242424'
   },
   {
-    title:'修改',
-    id:5,
-    color:'#1E90FF'
+    title: '修改',
+    id: 5,
+    color: '#1E90FF'
   },
 ];
+
+// 客户类型
+export const shareType = [
+  {
+    title: '私有',
+    id: 0,
+  },
+  {
+    title: '公共',
+    id: 1,
+  },
+  {
+    title: '签单',
+    id: 2,
+  },
+  {
+    title: '外联',
+    id: 3,
+  },
+  {
+    title: '渠道',
+    id: 4,
+  },
+];
+
+export const levelType = [
+  {
+    title: '一般客户',
+    id: 0,
+  },
+  {
+    title: '意向客户',
+    id: 1,
+  },
+  {
+    title: '重点客户',
+    id: 2,
+  },
+];
+
+export const industry = [
+  {
+    id: 0,
+    title: "",
+  },
+  {
+    id: 1,
+    title: "采掘",
+  },
+  {
+    id: 2,
+    title: "化工",
+  },
+  {
+    id: 3,
+    title: "钢铁",
+  },
+  {
+    id: 4,
+    title: "建筑材料",
+  },
+  {
+    id: 5,
+    title: "建筑装饰",
+  },
+  {
+    id: 6,
+    title: "电气设备",
+  },
+  {
+    id: 7,
+    title: "机械设备",
+  },
+  {
+    id: 8,
+    title: "国防军工",
+  },
+  {
+    id: 9,
+    title: "汽车",
+  },
+  {
+    id: 10,
+    title: "家用电器",
+  },
+  {
+    id: 11,
+    title: "纺织服装",
+  },
+  {
+    id: 12,
+    title: "轻工制造",
+  },
+  {
+    id: 13,
+    title: "商业贸易",
+  },
+  {
+    id: 14,
+    title: "农林牧渔",
+  },
+  {
+    id: 15,
+    title: "食品饮料",
+  },
+  {
+    id: 16,
+    title: "休闲服务",
+  },
+  {
+    id: 17,
+    title: "医药生物",
+  },
+  {
+    id: 18,
+    title: "公用事业",
+  },
+  {
+    id: 19,
+    title: "交通运输",
+  },
+  {
+    id: 20,
+    title: "房地产",
+  },
+  {
+    id: 21,
+    title: "电子",
+  },
+  {
+    id: 22,
+    title: "计算机",
+  },
+  {
+    id: 23,
+    title: "传媒",
+  },
+];

+ 31 - 1
src/utils/tools/index.js

@@ -1,4 +1,4 @@
-import { clockState, clockJournalState } from './config';
+import { clockState, clockJournalState, industry } from './config';
 import dayjs from "dayjs";
 import Taro from "@tarojs/taro";
 
@@ -276,4 +276,34 @@ export const getNameList = (aidList, arr) => {
     }
   }
   return list
+}
+
+export const getContactType = (val) => {
+  let theType = "";
+  let list = [
+    { key: "公出", value: 0 },
+    { key: "电话", value: 1 },
+    { key: "QQ", value: 2 },
+    { key: "微信", value: 3 },
+    { key: "邮件", value: 4 },
+    { key: "公出打卡", value: 5 },
+    { key: "来访面谈", value: 6 },
+  ]
+  list.map(function (item) {
+    if (item.value == val) {
+      theType = item.key
+    }
+  })
+  return theType;
+}
+
+// 行业
+export const getIndustryType = (val) => {
+  let theType = "";
+  industry.map(function (item) {
+    if (item.id == val) {
+      theType = item.title
+    }
+  })
+  return theType;
 }