xiaohaizhao 2 gadi atpakaļ
vecāks
revīzija
f3f2347e77

+ 4 - 1
app.json

@@ -149,7 +149,10 @@
                 "project/impower/initiate",
                 "project/impower/webview",
                 "project/impower/impower",
-                "select/linkman/select"
+                "select/linkman/select",
+                "saleAdmin/index",
+                "saleAdmin/detail",
+                "saleAdmin/insert"
             ]
         }
     ],

+ 384 - 0
packageA/saleAdmin/detail.js

@@ -0,0 +1,384 @@
+const _Http = getApp().globalData.http;
+Page({
+    data: {
+        isLeader: false, //是否为负责人
+        tabsActive: 0, //tabs 选中项
+        sat_orderclueid: "",
+        detail: '',
+        siteShow: false,
+    },
+    onLoad(options) {
+        const appAuth = wx.getStorageSync('auth').worderclue_public;
+        let tabsList = [{
+            label: "详细信息",
+            icon: "icon-tabxiangxixinxi1"
+        }, {
+            label: "跟进记录",
+            icon: "icon-tabgenjinjilu"
+        }, {
+            label: "来源线索",
+            icon: "icon-tabxiansuo",
+            model: "#Clue"
+        }, {
+            label: "跟进动态",
+            icon: "icon-tabgenjinjilu"
+        }, {
+            label: "操作",
+            icon: "icon-tabcaozuojilu1"
+        }]
+        if (appAuth.istask) tabsList.push({
+            label: "任务",
+            icon: "icon-tabrenwu",
+            model: "#Work"
+        })
+        tabsList.push({
+            label: "附件",
+            icon: "icon-tabfujian1"
+        })
+        this.setData({
+            sat_orderclueid: options.sat_orderclueid || options.id,
+            isAdmin: appAuth.options.some(v => v == "admin"), //是否具有管理权限
+            tabsList
+        });
+        this.getDetail();
+    },
+    getDetail() {
+        _Http.basic({
+            "classname": "webmanage.saletool.orderclue.publicclue.PublicClue",
+            "method": "selectDetail",
+            "version": 1,
+            "content": {
+                "nocache": true,
+                "sat_orderclueid": this.data.sat_orderclueid
+            },
+        }).then(res => {
+            console.log("线索详情", res)
+            if (res.msg != '成功') return wx.showToast({
+                title: res.msg,
+                icon: "none"
+            });
+            this.setData({
+                isLeader: res.data.createuserid == wx.getStorageSync('userMsg').userid,
+                detail: res.data,
+                briefs: [{
+                        label: "联系人",
+                        value: res.data.name
+                    }, {
+                        label: "联系方式",
+                        value: res.data.phonenumber
+                    }, {
+                        label: "市场活动",
+                        value: res.data.campaign_name
+                    }, {
+                        label: "领域",
+                        value: res.data.tradefield
+                    }, {
+                        label: '负责人',
+                        value: res.data.leader && res.data.leader.length > 0 ? res.data.leader[0].name : ''
+                    },
+                    {
+                        label: '分配状态',
+                        value: res.data.allocationstatus
+                    },
+                    {
+                        label: '跟进状态',
+                        value: res.data.status
+                    },
+                    {
+                        label: '跟进次数',
+                        value: res.data.followcount || '0'
+                    }
+                ],
+                list1: [{
+                    label: "客户(企业)",
+                    value: res.data.enterprisename_customer
+                }, {
+                    label: "联系人",
+                    value: res.data.name
+                }, {
+                    label: "联系人角色",
+                    value: res.data.contactsrole
+                }, {
+                    label: "联系方式",
+                    value: res.data.phonenumber
+                }, {
+                    label: "微信",
+                    value: res.data.wechatnum
+                }, {
+                    label: "省市县",
+                    value: res.data.province ? res.data.province + res.data.city + res.data.county : ''
+                }, {
+                    label: "地址",
+                    value: res.data.address
+                }, {
+                    label: "项目名称",
+                    value: res.data.projectname
+                }, {
+                    label: "项目规模",
+                    value: res.data.scale ? res.data.scale + res.data.unitname : ""
+                }, {
+                    label: "总投资额(万元)",
+                    value: res.data.totalinvestment
+                }, {
+                    label: "造价(万元)",
+                    value: res.data.costofconstruction
+                }, {
+                    label: "预计开工时间",
+                    value: res.data.begdate_due
+                }, {
+                    label: "预计完工时间",
+                    value: res.data.enddate_due
+                }, {
+                    label: "市场活动",
+                    value: res.data.campaign_name
+                }, {
+                    label: "领域",
+                    value: res.data.tradefield
+                }, {
+                    label: "设计院",
+                    value: res.data.institute
+                }, {
+                    label: "设计师",
+                    value: res.data.designer
+                }, {
+                    label: "关联项目",
+                    value: res.data.projectname1
+                }, {
+                    label: "来源",
+                    value: res.data.cluesource
+                }, {
+                    label: "线索概况",
+                    value: res.data.notes
+                }, {
+                    label: '所属业务员',
+                    value: res.data.salename
+                }, {
+                    label: '负责人',
+                    value: res.data.leader && res.data.leader.length > 0 ? res.data.leader[0].name : ''
+                }, {
+                    label: '上图员',
+                    value: res.data.uppictured
+                }, {
+                    label: '分配状态',
+                    value: res.data.allocationstatus
+                }, {
+                    label: '跟进状态',
+                    value: res.data.status
+                }],
+                list2: [{
+                    label: "创建人",
+                    value: res.data.createBy
+                }, {
+                    label: "创建时间",
+                    value: res.data.createDate
+                }, {
+                    label: "分配人",
+                    value: res.data.assignedBy
+                }, {
+                    label: "分配时间",
+                    value: res.data.assignedDate
+                }, {
+                    label: "最近跟进人",
+                    value: res.data.followBy
+                }, {
+                    label: "最近跟进时间",
+                    value: res.data.followDate
+                }, {
+                    label: "最近编辑人",
+                    value: res.data.editBy
+                }, {
+                    label: "最近编辑时间",
+                    value: res.data.editDate
+                }, {
+                    label: "无效原因",
+                    value: res.data.invalidreason
+                }, {
+                    label: "作废原因",
+                    value: res.data.deletereason
+                }, {
+                    label: "跟进次数",
+                    value: res.data.followcount
+                }]
+            });
+            /* 更新列表中状态 */
+            let page = getCurrentPages().find(v => v.__route__ == 'packageA/publicClue/index');
+            if (page) {
+                let index = page.data.list.findIndex(v => v.sat_orderclueid == res.data.sat_orderclueid);
+                if (index != -1) page.setData({
+                    [`list[${index}].status`]: res.data.status
+                })
+            }
+            this.setTabbarList(res.data.status)
+            this.getTags();
+            if (res.data.allocationstatus == '已分配') this.getGroup();
+            this.partialRenewal();
+        })
+    },
+    setTabbarList(status) {
+        let tabbarList = this.data.isAdmin ? [{
+            icon: "icon-zhuanyi",
+            label: "分配"
+        }, {
+            icon: "icon-dibu-jieshu",
+            label: "删除"
+        }] : [];
+        if (status == '待跟进') tabbarList.unshift({
+            icon: "icon-bianji",
+            label: "编辑"
+        })
+        if (wx.getStorageSync('auth').worderclue_public.options.some(v => v == "shiftSite")) {
+            tabbarList.unshift({
+                icon: "icon-CRM",
+                label: "转站点"
+            })
+            this.setData({
+                siteShow: true
+            })
+        }
+        this.setData({
+            tabbarList
+        })
+    },
+    //tabs 切换
+    tabsChange({
+        detail
+    }) {
+        this.setData({
+            tabsActive: detail
+        });
+        this.partialRenewal();
+    },
+    //更新标签
+    getTags() {
+        this.selectComponent("#Tags").getTags();
+    },
+    //更新团队成员
+    getGroup() {
+        this.selectComponent("#Group").getList();
+    },
+    //局部数据更新 tabs
+    partialRenewal(init = false) {
+        let id = this.data.detail.sat_orderclueid;
+        let model = '';
+        let name = this.data.tabsList[this.data.tabsActive].label;
+        switch (name) {
+            case "任务":
+                model = "#Work"
+                break;
+            case "跟进记录":
+                model = "#follow"
+                break;
+            case "来源线索":
+                model = "#Clue"
+                break;
+            case "操作":
+                model = "#Record"
+                break;
+            case "跟进动态":
+                model = "#Trace"
+                break;
+            case "附件":
+                model = "#Files"
+                break;
+        };
+        if (model) {
+            // 确定好模块ID total = null 是第一次加载 加载数据
+            // init是新增或修改需要清数据
+            let Component = this.selectComponent(model);
+            const {
+                total,
+                pageNumber,
+                pageTotal
+            } = Component.data.content;
+            if (total == null || init) {
+                Component.getList(id, init);
+            } else if (pageNumber <= pageTotal) {
+                Component.getList(id, false);
+            } else {
+                //用来判断 在搜索页面修改,与tabs选项不一致 但是切换到该选项 重置数据
+            }
+        }
+    },
+    onReachBottom() {
+        this.partialRenewal();
+    },
+
+    //详情按钮回调
+    tabbarOnClick({
+        detail
+    }) {
+        let data = this.data.detail,
+            that = this;
+        switch (detail.label) {
+            case "编辑":
+                wx.navigateTo({
+                    url: `/packageA/publicClue/addClue?rowData=${JSON.stringify(this.data.detail)}`,
+                })
+                break;
+            case "分配":
+                wx.navigateTo({
+                    url: `/packageA/publicClue/distribution?data=${JSON.stringify(this.data.detail)}`,
+                })
+                break;
+
+            case "转站点":
+                that.selectComponent("#ShiftSite").showSite()
+                break;
+            case "删除":
+                wx.showModal({
+                    title: '提示',
+                    content: `是否确认删除该线索?`,
+                    complete: ({
+                        confirm
+                    }) => {
+                        if (confirm) _Http.basic({
+                            "id": 20221101100502,
+                            "content": {
+                                "sat_orderclueids": [this.data.detail.sat_orderclueid]
+                            }
+                        }).then(res => {
+                            wx.showToast({
+                                title: res.msg == '成功' ? `操作成功` : res.msg,
+                                icon: "none"
+                            });
+                            setTimeout(() => {
+                                wx.navigateBack()
+                                getCurrentPages().forEach(v => {
+                                    if (v.__route__ == "packageA/publicClue/index") {
+                                        v.getList(true)
+                                    }
+                                })
+                            }, 300)
+
+                        })
+                    }
+                })
+                break;
+            case "撤回":
+                wx.showModal({
+                    title: '提示',
+                    content: `是否确认撤回该线索?`,
+                    complete: ({
+                        confirm
+                    }) => {
+                        if (confirm) _Http.basic({
+                            classname: "webmanage.saletool.orderclue.publicclue.PublicClue",
+                            method: "revoke",
+                            "content": {
+                                "sat_orderclueid": this.data.detail.sat_orderclueid
+                            }
+                        }).then(res => {
+                            setTimeout(() => {
+                                wx.showToast({
+                                    title: res.msg == '成功' ? `操作成功` : res.msg,
+                                    icon: "none"
+                                });
+                            }, 1000)
+                            if (res.msg == '成功') this.getDetail()
+                        })
+                    }
+                })
+                break;
+        }
+    },
+})

+ 13 - 0
packageA/saleAdmin/detail.json

@@ -0,0 +1,13 @@
+{
+    "usingComponents": {
+        "Preview": "../setclient/modules/preview/index",
+        "Trace": "../setclient/modules/trace/index",
+        "Record": "/packageA/public/record/index",
+        "Files": "/packageA/public/files/index",
+        "Follow": "/packageA/publicClue/modules/follow/follow",
+        "Work": "/packageA/public/work/index",
+        "ShiftSite": "/packageA/publicClue/modules/shiftSite/index",
+        "Clue": "../saleClue/modules/clue/index"
+    },
+    "navigationBarTitleText": "线索详情"
+}

+ 15 - 0
packageA/saleAdmin/detail.scss

@@ -0,0 +1,15 @@
+.header {
+    background-color: #fff;
+    padding: 20rpx 30rpx 0rpx;
+    box-sizing: border-box;
+    margin-bottom: -16rpx;
+
+    .title {
+        height: 40rpx;
+        font-size: 28rpx;
+        font-family: PingFang SC-Bold, PingFang SC;
+        font-weight: bold;
+        color: #333333;
+        margin-bottom: 16rpx;
+    }
+}

+ 25 - 0
packageA/saleAdmin/detail.wxml

@@ -0,0 +1,25 @@
+<view class="header">
+    <view class="title">{{detail.enterprisename_customer}}</view>
+    <Yl-tags id="Tags" add ownertable='sat_orderclue' ownerid='{{detail.sat_orderclueid}}' />
+</view>
+<!-- 简介 -->
+<Yl_Detail list="{{briefs}}">
+    <Yl-group wx:if="{{detail.allocationstatus == '已分配'}}" slot='bottom' id='Group' add ownertable='sat_orderclue' ownerid='{{sat_orderclueid}}' />
+</Yl_Detail>
+<view style="height: 20rpx;" />
+<Yl_FunTabs list='{{tabsList}}' active='{{tabsActive}}' bind:onChenge="tabsChange">
+    <Preview slot='详细信息' list1='{{list1}}' list2='{{list2}}' />
+    <Follow slot='跟进记录' id='follow' />
+    <Clue slot='来源线索' id='Clue' />
+    <Files slot="附件" id="Files" ownertable="sat_orderclue" ownerid="{{detail.sat_orderclueid}}" />
+    <Trace slot='跟进动态' id='Trace' ownertable='sat_orderclue' ownerid='{{detail.sat_orderclueid}}' />
+    <Work slot='任务' id='Work' ownertable='sat_orderclue' ownerid='{{detail.sat_orderclueid}}' disabled="{{isAdmin||isLeader}}" />
+    <Record slot='操作' id="Record" ownertable='sat_orderclue' ownerid='{{detail.sat_orderclueid}}' />
+    <view style="height: 140rpx;" />
+</Yl_FunTabs>
+
+<!-- 底部 -->
+<Yl_Tabbar wx:if="{{tabbarList.length}}" list='{{tabbarList}}' bind:callback="tabbarOnClick" />
+
+<!-- 转站点 -->
+<ShiftSite id='ShiftSite' sat_orderclueid='{{sat_orderclueid}}' wx:if="{{siteShow}}" />

+ 271 - 0
packageA/saleAdmin/index.js

@@ -0,0 +1,271 @@
+const _Http = getApp().globalData.http;
+Page({
+
+    /**
+     * 页面的初始数据
+     */
+    data: {
+        loading: true,
+        navList: [{
+            label: "我负责的",
+            icon: "icon-webxialaxuanxiangjiantou",
+            color: "",
+            width: "",
+            id: "1"
+        }, {
+            label: "排序",
+            icon: "icon-jiangxu1",
+            color: "",
+            width: "",
+            id: "sort"
+        }, {
+            label: "筛选",
+            icon: "icon-shaixuan",
+            color: "",
+            width: "",
+            id: "2"
+        }],
+        classShow: false,
+        "content": {
+            "nocache": true,
+            "isExport": 0,
+            "pageNumber": 1,
+            "pageTotal": 1,
+            "pageSize": 20,
+            "where": {
+                "condition": "",
+                "tablefilter": {},
+                // "cluetype": "业务员",
+                "allocationstatus": "", //分配状态
+                "status": "", //跟进状态
+                "tradefield": "", //领域
+                "tag": "", //标签
+            },
+        },
+        filtrate: false
+    },
+    onLoad(options) {
+        this.setData({
+            insert: wx.getStorageSync('auth').worderclue.options.some(v => v == 'insert'), //查询新增权限
+            classActions: wx.getStorageSync('templetList').map(v => {
+                return {
+                    name: v.templetname,
+                    index: v.templetid
+                }
+            }),
+            'navList[0].label': wx.getStorageSync('templetList')[0].templetname,
+            "content.type": wx.getStorageSync('templetList')[0].templetid,
+        });
+        this.getList()
+        this.getClueArea()
+    },
+    /* 获取列表 */
+    getList(init = false) {
+        if (init.detail != undefined) init = init.detail;
+        let content = this.data.content;
+        if (init) content.pageNumber = 1;
+        if (content.pageNumber > content.pageTotal) return;
+        _Http.basic({
+            "id": 20221101094302,
+            content
+        }).then(res => {
+            console.log("线索管理", res)
+            this.selectComponent('#ListBox').RefreshToComplete();
+            if (res.msg != '成功') return wx.showToast({
+                title: res.msg,
+                icon: "none"
+            })
+            this.setData({
+                loading: false,
+                'content.pageNumber': res.pageNumber + 1,
+                'content.pageTotal': res.pageTotal,
+                'content.total': res.total,
+                'content.sort': res.sort,
+                list: res.pageNumber == 1 ? res.data : this.data.list.concat(res.data)
+            });
+            this.setListHeight();
+            this.getTags();
+        })
+    },
+    /* 获取线索状态 */
+    getClueArea() {
+        let filtratelist = [{
+            label: "分配状态",
+            index: null,
+            showName: "value", //显示字段
+            valueKey: "allocationstatus", //返回Key
+            selectKey: "value", //传参 代表选着字段 不传参返回整个选择对象
+            value: "", //选中值
+            list: [{
+                value: "待分配"
+            }, {
+                value: "已分配"
+            }]
+        }];
+        _Http.basic({
+            "classname": "sysmanage.develop.optiontype.optiontype",
+            "method": "optiontypeselect",
+            "content": {
+                "typename": 'clueprivate'
+            }
+        }).then(res => {
+            console.log("线索范围", res)
+            if (res.msg != '成功') return wx.showToast({
+                title: res.data,
+                icon: "none"
+            })
+            filtratelist.push({
+                label: "线索状态",
+                index: null,
+                showName: "value", //显示字段
+                valueKey: "status", //返回Key
+                selectKey: "value", //传参 代表选着字段 不传参返回整个选择对象
+                value: "", //选中值
+                list: res.data
+            })
+            this.setData({
+                filtratelist
+            })
+            this.setListHeight();
+        })
+        _Http.basic({
+            "id": 20221223141802,
+            "content": {
+                "pageNumber": 1,
+                "pageSize": 9999,
+                "where": {
+                    "condition": ""
+                }
+            }
+        }, false).then(res => {
+            console.log("获取领域", res)
+            if (res.msg == '成功') {
+                filtratelist.push({
+                    label: "领域",
+                    index: null,
+                    showName: "tradefield", //显示字段
+                    valueKey: "tradefield", //返回Key
+                    selectKey: "tradefield", //传参 代表选着字段 不传参返回整个选择对象
+                    value: "", //选中值
+                    list: res.data
+                })
+                this.setData({
+                    filtratelist
+                })
+            }
+        })
+        _Http.basic({
+            "id": 20221013104401,
+            "content": {
+                "nochace": true,
+                "isExport": 1,
+                "pageNumber": 1,
+                sys_systemtagid: 14,
+                "pageSize": 1000,
+                "where": {
+                    "condition": ""
+                }
+            }
+        }, false).then(res => {
+            console.log("获取标签", res)
+            if (res.msg == '成功') {
+                filtratelist.push({
+                    label: "标签",
+                    index: null,
+                    showName: "tag", //显示字段
+                    valueKey: "tag", //返回Key
+                    selectKey: "tag", //传参 代表选着字段 不传参返回整个选择对象
+                    value: "", //选中值
+                    list: res.data
+                })
+                this.setData({
+                    filtratelist
+                })
+            }
+        })
+    },
+    /* 处理搜索 */
+    onSearch({
+        detail
+    }) {
+        this.setData({
+            "content.where.condition": detail
+        });
+        this.getList(true);
+    },
+    /* 获取列表标签 */
+    getTags() {
+        let list = this.data.list,
+            ownerids = list.map(v => v.sat_orderclueid);
+        _Http.basic({
+            "id": 20221018102001,
+            "content": {
+                nocache: true,
+                "ownertable": "sat_orderclue",
+                ownerids
+            }
+        }).then(res => {
+            console.log("标签", res)
+            for (let key in res.data) {
+                let index = list.findIndex(v => v.sat_orderclueid == key);
+                list[index].tags = res.data[key]
+            };
+            this.setData({
+                list
+            })
+        })
+    },
+    /* 去添加 */
+    openType() {
+        wx.navigateTo({
+            url: '/packageA/saleAdmin/insert',
+        })
+    },
+    onReady() {
+        this.setListHeight();
+    },
+    setListHeight() {
+        this.selectComponent("#ListBox").setHeight(".total", this);
+    },
+    /* 顶部条件导航回调 */
+    navClick({
+        detail
+    }) {
+        switch (detail.id) {
+            case '1':
+                this.setData({
+                    classShow: true
+                })
+                break;
+            case '2':
+                this.setData({
+                    filtrate: true
+                })
+                break;
+        }
+    },
+    classClose() {
+        this.setData({
+            classShow: false
+        })
+    },
+    classSelect({
+        detail
+    }) {
+        if (this.data.content.type == detail.index) return this.classClose();
+        this.setData({
+            "content.type": detail.index,
+            'navList[0].label': detail.name
+        })
+        this.classClose();
+        this.getList(true)
+    },
+    /* 处理筛选 */
+    handleFilter({
+        detail
+    }) {
+        detail.condition = this.data.content.where.condition;
+        this.data.content.where = detail;
+        this.getList(true)
+    }
+})

+ 6 - 0
packageA/saleAdmin/index.json

@@ -0,0 +1,6 @@
+{
+    "usingComponents": {
+        "list": "./modules/list/index"
+    },
+    "navigationBarTitleText": "线索管理"
+}

+ 14 - 0
packageA/saleAdmin/index.scss

@@ -0,0 +1,14 @@
+page {
+    height: 100vh;
+    overflow: hidden;
+}
+
+.total {
+    height: 64rpx;
+    line-height: 64rpx;
+    font-size: 24rpx;
+    font-family: PingFang SC-Regular, PingFang SC;
+    color: #666666;
+    background: #F4F5F7;
+    padding-left: 30rpx;
+}

+ 12 - 0
packageA/saleAdmin/index.wxml

@@ -0,0 +1,12 @@
+<Yl_nav search list='{{navList}}' sort='{{content.sort}}' bind:onClick='navClick' bindonSearch="onSearch" />
+<!-- 显示类型 -->
+<van-action-sheet bind:click-overlay='classClose' show="{{ classShow }}" actions="{{ classActions }}" cancel-text="取消" bind:cancel="classClose" bind:select="classSelect" />
+<view class="total">共{{content.total}}个</view>
+<!-- 浮动按钮 -->
+<Yl_FloatingButton wx:if="{{insert}}" bindtap="openType" />
+<Yl_ListBox id='ListBox' bind:getlist='getList'>
+    <list list='{{list}}' />
+    <view style="height: 80rpx;" />
+</Yl_ListBox>
+
+<Yl_Filtrate1 show='{{filtrate}}' list="{{filtratelist}}" bindhandle="handleFilter" />

+ 375 - 0
packageA/saleAdmin/insert.js

@@ -0,0 +1,375 @@
+const _Http = getApp().globalData.http,
+    getTime = require("../../utils/getTime");
+
+Page({
+    data: {
+        loading: false,
+        showAll: false,
+        form: [{
+                label: "是否上图",
+                error: false,
+                errMsg: "",
+                hint: "",
+                type: "radio",
+                value: "",
+                radioList: [{
+                    id: '1',
+                    name: '是'
+                }, {
+                    id: '0',
+                    name: '否'
+                }],
+                valueName: "isfillbrangd", //绑定的字段名称
+                required: false, //必填
+                direction: "horizontal"
+            }, {
+                label: "客户(企业)",
+                error: false,
+                errMsg: "",
+                type: "text",
+                value: "",
+                placeholder: "客户(企业)",
+                valueName: "enterprisename",
+                checking: "base",
+                slot: "info",
+                required: false
+            }, {
+                label: "联系人",
+                error: false,
+                errMsg: "",
+                type: "text",
+                value: "",
+                placeholder: "联系人",
+                valueName: "name",
+                checking: "base",
+                required: false
+            }, {
+                label: "联系方式",
+                error: false,
+                checking: "phone",
+                errMsg: "",
+                type: "number",
+                value: "",
+                placeholder: "手机号码",
+                valueName: "phonenumber", //绑定的字段名称
+                required: true, //必填
+            }, {
+                label: "微信",
+                error: false,
+                errMsg: "",
+                type: "text",
+                value: "",
+                placeholder: "微信号",
+                valueName: "wechatnum",
+                checking: "base",
+                required: false
+            }, {
+                label: "省市县",
+                error: false,
+                errMsg: "",
+                type: "region",
+                value: "",
+                placeholder: "省市县",
+                valueName: "region",
+                checking: "base",
+                required: false
+            }, {
+                label: "详细地址",
+                error: false,
+                errMsg: "",
+                type: "textarea",
+                value: "",
+                placeholder: "详细地址",
+                valueName: "address",
+                checking: "base",
+                required: false
+            }, {
+                label: "项目名称",
+                error: false,
+                errMsg: "",
+                type: "textarea",
+                value: "",
+                placeholder: "项目名称",
+                valueName: "projectname",
+                checking: "base",
+                required: false
+            }, {
+                label: "项目规模",
+                error: false,
+                errMsg: "",
+                type: "digit",
+                value: "",
+                placeholder: "请填写数值",
+                valueName: "scale",
+                checking: "base",
+                required: false
+            }, {
+                label: "项目规模单位",
+                error: false,
+                errMsg: "",
+                type: "option",
+                optionNmae: "scaleunitname",
+                optionType: "radio", //复选   radio 单选
+                value: "",
+                placeholder: "选择单位",
+                valueName: "unitname",
+                required: false
+            }, {
+                label: "总投资额(万元)",
+                error: false,
+                errMsg: "",
+                type: "digit",
+                value: "",
+                placeholder: "请填写金额",
+                valueName: "totalinvestment",
+                checking: "base",
+                required: false
+            }, {
+                label: "造价(万元)",
+                error: false,
+                errMsg: "",
+                type: "digit",
+                value: "",
+                placeholder: "请填写金额",
+                valueName: "costofconstruction",
+                checking: "base",
+                required: false
+            }, {
+                label: "预计开工时间",
+                error: false,
+                errMsg: "",
+                type: "date",
+                fields: "month",
+                value: "",
+                placeholder: "预计开工时间",
+                valueName: "begdate_due",
+                checking: "base",
+                required: false
+            }, {
+                label: "预计完工时间",
+                error: false,
+                errMsg: "",
+                type: "date",
+                fields: "month",
+                value: "",
+                placeholder: "预计完工时间",
+                valueName: "enddate_due",
+                checking: "base",
+                required: false
+            },
+            {
+                label: "市场活动",
+                error: false,
+                errMsg: "",
+                type: "route",
+                url: "/packageA/select/selectActivity/index",
+                value: "",
+                params: {
+                    "id": 20221101095102,
+                    "content": {
+                        nocache: true,
+                        isAll: 0,
+                        "where": {
+                            'condition': '',
+                            "unend": 1
+                        }
+                    }
+                },
+                query: "&radio=true",
+                placeholder: "选择市场活动",
+                valueName: "campaign_name",
+                checking: "base",
+                required: false
+            }, {
+                label: "领域",
+                error: false,
+                errMsg: "",
+                type: "selector",
+                range: [],
+                rangeKey: "tradefield",
+                rangeIndex: "",
+                value: "",
+                placeholder: "领域",
+                valueName: "tradefield",
+                required: true, //必填
+            }, {
+                label: "来源",
+                error: false,
+                errMsg: "",
+                type: "text",
+                value: "",
+                placeholder: "来源",
+                valueName: "cluesource",
+                checking: "base",
+                required: false
+            }, {
+                label: "线索概括",
+                error: false,
+                errMsg: "",
+                type: "text",
+                value: "",
+                placeholder: "线索概括",
+                valueName: "notes",
+                checking: "base",
+                required: false
+            }
+        ],
+        "content": {
+            "sat_orderclueid": 0,
+            "sat_orderclueid": 0, //活动id,当活动id大于0是默认业务员创建
+            "isprivate": 1 //0表示公海,1表示私域
+        },
+        disabled: true
+    },
+    onLoad(options) {
+        if (options.sat_orderclueid) this.data.content.sat_orderclueid = options.sat_orderclueid;
+        if (options.rowData) {
+            let data = JSON.parse(options.rowData);
+            this.setData({
+                form: this.data.form.map(v => {
+                    if (v.valueName != 'region') {
+                        if (v.valueName == 'campaign_name') {
+                            v.value = data[v.valueName] ? [data[v.valueName],
+                                [data.sat_campaignid]
+                            ] : ""
+                        } else {
+                            v.value = data[v.valueName] || "";
+                        }
+                    } else {
+                        v.value = data.province ? [data.province, data.city, data.county] : []
+                    }
+                    return v
+                }),
+                'form[0].value': data.enterprisename_customer || data.enterprisename || "",
+                'content.sat_orderclueid': data.sat_orderclueid || 0,
+                'content.sa_customersid': data.sa_customersid || 0,
+                'content.sat_campaignid': data.sat_campaignid || 0
+            })
+            this.selectComponent("#Form").confirm();
+        } else {
+            this.getUnitname();
+        }
+        /* 获取领域 */
+        _Http.basic({
+            "id": 20221223141802,
+            "content": {
+                "pageNumber": 1,
+                "pageSize": 99999,
+                "where": {
+                    "condition": ""
+                }
+            }
+        }).then(res => {
+            console.log("获取领域", res)
+            let item = this.data.form.find(v => v.label == '领域');
+            item.range = res.msg == '成功' ? res.data : [];
+            this.setData({
+                form: this.data.form
+            })
+        })
+    },
+    getUnitname() {
+        _Http.basic({
+            "classname": "sysmanage.develop.optiontype.optiontype",
+            "method": "optiontypeselect",
+            "content": {
+                pageNumber: 1,
+                "pageSize": 1,
+                "typename": "scaleunitname",
+                "parameter": {
+                    "siteid": wx.getStorageSync('siteP').siteid
+                }
+            }
+        }).then(res => {
+            console.log("项目规模", res)
+            if (res.msg == '成功') {
+                let index = this.data.form.findIndex(v => v.label == '项目规模单位');
+                if (index != -1) this.setData({
+                    [`form[${index}].value`]: res.data[0].value
+                })
+            }
+        })
+    },
+    introduce({
+        detail
+    }) {
+        let item = detail;
+        this.setData({
+            [`form[0].value`]: item.companyName,
+            [`form[5].value`]: item.address,
+            [`form[4].value`]: [item.regProvince, item.regCity, item.regArea],
+        })
+    },
+    queryClient() {
+        let data = this.selectComponent("#Form").query();
+        if (data.enterprisename == '') {
+            wx.showToast({
+                title: `您还未填写企业名称`,
+                icon: "none"
+            });
+        } else {
+            this.setData({
+                form: this.selectComponent("#Form").data.form,
+            })
+            this.selectComponent("#Info").queryClient(data.enterprisename)
+        }
+    },
+    submit() {
+        this.setData({
+            loading: true
+        })
+        let content = {
+            ...this.data.content,
+            ...this.selectComponent("#Form").submit()
+        };
+        content.sat_campaignid = content.campaign_name ? content.campaign_name[1][0] : 0;
+        content.city = content.region[1] || "";
+        content.county = content.region[2] || "";
+        content.province = content.region[0] || "";
+        delete(content.region)
+        delete(content.campaign_name)
+        _Http.basic({
+            "id": "20221205162402",
+            content
+        }).then(res => {
+            console.log("添加线索", res)
+            this.setData({
+                loading: false
+            })
+            wx.showToast({
+                title: res.msg != '成功' ? res.msg : '保存成功',
+                icon: "none"
+            })
+            if (res.msg != '成功') return;
+            setTimeout(() => {
+                wx.navigateBack();
+                getCurrentPages().forEach(v => {
+                    if (v.__route__ == 'packageA/saleClue/detail') {
+                        v.getDetail();
+                    } else if (v.__route__ == 'packageA/saleClue/index') {
+                        v.getList(true);
+
+                    } else if (['packageA/setclient/detail', 'packageA/publicCustomer/detail'].includes(v.__route__)) {
+                        v.selectComponent("#Clue").getList(this.data.content.sa_customersid, true)
+                    }
+                })
+            }, 300)
+        })
+    },
+    // 是否显示全部
+    onChange({
+        detail
+    }) {
+        this.setData({
+            showAll: detail
+        })
+    },
+    /* 表单必填项是否完成 */
+    onConfirm({
+        detail
+    }) {
+        this.setData({
+            disabled: detail
+        })
+    }
+})

+ 6 - 0
packageA/saleAdmin/insert.json

@@ -0,0 +1,6 @@
+{
+    "usingComponents": {
+        "information": "../setclient/modules/information/index"
+    },
+    "navigationBarTitleText": "添加线索"
+}

+ 24 - 0
packageA/saleAdmin/insert.scss

@@ -0,0 +1,24 @@
+.new-footer {
+    display: flex;
+    align-items: center;
+    justify-content: flex-end;
+    position: fixed;
+    width: 100vw;
+    height: 130rpx;
+    background: #FFFFFF;
+    box-shadow: 0px -4rpx 16rpx 2rpx rgba(150, 157, 165, 0.16);
+    bottom: 0;
+    z-index: 9999;
+
+    .new-submit {
+        width: 156rpx;
+        height: 90rpx;
+        background: #3874F6;
+        border-radius: 8rpx;
+        font-size: 28rpx;
+        font-family: PingFang SC-Bold, PingFang SC;
+        font-weight: bold;
+        color: #FFFFFF;
+        margin-right: 30rpx;
+    }
+}

+ 10 - 0
packageA/saleAdmin/insert.wxml

@@ -0,0 +1,10 @@
+<Yl_Headline title='基本信息' type='switch' switchLabel='仅显示必填信息' switch='{{showAll}}' bind:callBack='onChange' />
+<Yl_field id='Form' form='{{form}}' showAll='{{!showAll}}' bind:onConfirm='onConfirm' bind:interrupt="interrupt">
+    <view slot='info'>
+        <information id="Info" catch:queryClient='queryClient' catch:callback='introduce' />
+    </view>
+</Yl_field>
+<view style="height: 100rpx;" />
+<view class="new-footer">
+    <van-button custom-class='new-submit' disabled='{{disabled||loading}}' loading='{{loading}}' bindclick='submit'>提交</van-button>
+</view>

+ 16 - 0
packageA/saleAdmin/modules/list/index.js

@@ -0,0 +1,16 @@
+Component({
+    properties: {
+        list: {
+            type: Array
+        }
+    },
+    methods: {
+        distribution({
+            currentTarget
+        }) {
+            wx.navigateTo({
+                url: `/packageA/publicClue/distribution?data=${JSON.stringify(currentTarget.dataset.item)}`,
+            })
+        }
+    }
+})

+ 4 - 0
packageA/saleAdmin/modules/list/index.json

@@ -0,0 +1,4 @@
+{
+    "component": true,
+    "usingComponents": {}
+}

+ 86 - 0
packageA/saleAdmin/modules/list/index.scss

@@ -0,0 +1,86 @@
+.offer-list {
+    width: 100%;
+    padding: 20rpx 30rpx;
+    box-sizing: border-box;
+    background-color: #fff;
+    border-bottom: 1rpx solid #ddd;
+    font-family: PingFang SC-Regular, PingFang SC;
+    position: relative;
+
+    .action {
+        position: absolute;
+        right: 0;
+        bottom: 30rpx;
+    }
+
+    .title {
+        position: relative;
+        display: flex;
+        height: 42rpx;
+        align-items: center;
+
+        >text {
+            display: inline-block;
+            width: 80%;
+            font-size: 30rpx;
+            color: #333333;
+        }
+
+        .status {
+            position: absolute;
+            right: -30rpx;
+            width: 132rpx;
+            height: 40rpx;
+            border-radius: 20rpx 0px 0px 20rpx;
+            box-sizing: border-box;
+            padding-left: 30rpx;
+            line-height: 40rpx;
+            font-size: 24rpx;
+            font-family: PingFang SC-Regular, PingFang SC;
+            color: #FFFFFF;
+        }
+    }
+
+    .tag-box {
+        display: flex;
+        align-items: center;
+        width: 100%;
+
+        .datatag,
+        .systemtag {
+            flex-shrink: 0;
+            margin-top: 6rpx;
+            background: #3874f6;
+            color: #ffffff;
+            margin-right: 10rpx;
+            display: flex;
+            align-items: center;
+            height: 40rpx;
+            font-size: 20rpx;
+            padding: 0 10rpx;
+            border-radius: 20rpx;
+            font-family: PingFang SC-Regular, PingFang SC;
+        }
+
+        .datatag {
+            background: #FA8C16;
+        }
+    }
+
+    .exp {
+        height: 34rpx;
+        font-size: 24rpx;
+        color: #666;
+        margin-top: 8rpx;
+
+        text {
+            color: #333333;
+        }
+    }
+}
+
+.line-1 {
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+}

+ 37 - 0
packageA/saleAdmin/modules/list/index.wxml

@@ -0,0 +1,37 @@
+<navigator class="offer-list" url="/packageA/saleAdmin/detail?id={{item.sat_orderclueid}}" wx:for="{{list}}" wx:key="sat_orderclueid">
+    <view class="title">
+        <text class="line-1">{{item.enterprisename_customer || " --"}}</text>
+        <view class="status" style="background-color: {{backColor.getColor(item.status)}};">{{item.status}}</view>
+    </view>
+
+    <view class="tag-box">
+        <view class="systemtag" wx:for="{{item.tags.systemtag}}" wx:key="item">{{item}}</view>
+        <view class="datatag" wx:for="{{item.tags.datatag}}" wx:key="item">{{item}}</view>
+    </view>
+    <view class="exp line-1">省市县:{{item.province?item.province+item.city+item.county:" --"}}</view>
+    <view class="exp line-1">联系人:<text>{{item.name||' --'}}</text></view>
+    <view class="exp line-1">联系方式:<text>{{item.phonenumber || '--'}}</text></view>
+    <view class="exp line-1">领域:<text>{{item.tradefield || '--'}}</text></view>
+    <view class="exp line-1">市场活动:{{item.campaign_name||"--"}}</view>
+    <view class="exp line-1">分配状态:{{item.allocationstatus||"--"}}</view>
+    <van-button wx:if="{{allot && item.allocationstatus=='待分配'}}" custom-class='action' catchtap="distribution" data-item="{{item}}">分配</van-button>
+
+</navigator>
+
+<My_empty wx:if="{{list.length == 0}}" />
+
+<wxs module="backColor">
+    module.exports.getColor = function (status) {
+        var color = null;
+        if (status == '待跟进') {
+            color = '#FA8C16';
+        } else if (status == '跟进中') {
+            color = '#52C41A';
+        } else if (status == '已转化') {
+            color = '#F60909';
+        } else {
+            color = '#BBBBBB';
+        };
+        return color
+    }
+</wxs>

+ 7 - 0
project.private.config.json

@@ -28,6 +28,13 @@
                     "query": "",
                     "launchMode": "default",
                     "scene": null
+                },
+                {
+                    "name": "线索管理",
+                    "pathName": "packageA/saleAdmin/index",
+                    "query": "",
+                    "launchMode": "default",
+                    "scene": null
                 }
             ]
         }

+ 5 - 0
utils/work/apps.js

@@ -104,6 +104,11 @@ function getcrm() {
         path: "/packageA/saleClue/index",
         icon: "work-xiaoshouxiansuo",
         objectname: "sat_orderclue"
+    }, {
+        name: "线索管理",
+        path: "/packageA/saleAdmin/index",
+        icon: "work-xiaoshouxiansuo",
+        objectname: "sat_orderclue"
     }, {
         name: "公海客户",
         path: "/packageA/publicCustomer/index",