Просмотр исходного кода

客户/项目 跟进动态特殊处理

xiaohaizhao 2 лет назад
Родитель
Сommit
b1f0279cbd

+ 5 - 2
app.json

@@ -27,7 +27,9 @@
         "pages/tabbar/workbench/index",
         "pages/mediaLibrary/index",
         "pages/tabbar/mine/webView",
-        "pages/tabbar/mine/associatedPublicNumber"
+        "pages/tabbar/mine/associatedPublicNumber",
+        "pages/trace/insert",
+        "pages/trace/detail"
     ],
     "subpackages": [
         {
@@ -146,7 +148,8 @@
                 "project/modules/fail/index",
                 "project/impower/initiate",
                 "project/impower/webview",
-                "project/impower/impower"
+                "project/impower/impower",
+                "select/linkman/select"
             ]
         }
     ],

+ 1 - 3
packageA/project/detail.js

@@ -445,9 +445,7 @@ Page({
                 }
                 break;
             case "跟进":
-                wx.navigateTo({
-                    url: `/packageA/setclient/modules/trace/add/index?ownertable=sa_project&ownerid=${data.sa_projectid}`,
-                })
+                that.selectComponent("#Trace").insetr();
                 break;
             case "编辑":
                 let tags = that.selectComponent("#Tags").data.systemtag;

+ 1 - 1
packageA/project/detail.json

@@ -1,7 +1,7 @@
 {
     "usingComponents": {
         "Preview": "../setclient/modules/preview/index",
-        "Trace": "../setclient/modules/trace/index",
+        "Trace": "/pages/trace/index",
         "Offers": "./modules/offers/index",
         "Task": "./modules/task/index",
         "TaskTabs": "./modules/task/tabs/index",

+ 1 - 1
packageA/project/detail.wxml

@@ -15,7 +15,7 @@
 <view style="height: 20rpx;" />
 <Yl_FunTabs list='{{tabsList}}' active='{{tabsActive}}' bind:onChenge="tabsChange">
     <Preview slot='详细信息' list1='{{list1}}' list2='{{list2}}' />
-    <Trace slot='跟进动态' id='Trace' ownertable='sa_project' ownerid='{{detail.sa_projectid}}' disabled="{{disabled}}" />
+    <Trace slot='跟进动态' id='Trace' ownertable='sa_project' ownerid='{{detail.sa_projectid}}' />
     <Work slot='任务' id='Work' ownertable='sa_project' ownerid='{{detail.sa_projectid}}' disabled="{{(isAdmin||isLeader) && disabled}}" />
     <Task slot='项目评估' id='Task' disabled="{{(per.query(options,'assess')||isAdmin||isLeader) && disabled}}" />
     <Contract slot='合同' id='Contract' disabled="{{(per.query(options,'assess')||isAdmin||isLeader) && disabled}}" isInsert='{{isInsert}}' />

+ 3 - 4
packageA/publicCustomer/detail.js

@@ -128,7 +128,8 @@ Page({
     tabbarOnClick({
         detail
     }) {
-        let data = this.data.detail;
+        let data = this.data.detail,
+            that = this;
         switch (detail.label) {
             case "领取":
                 let that = this;
@@ -158,9 +159,7 @@ Page({
                 })
                 break;
             case "跟进":
-                wx.navigateTo({
-                    url: `/packageA/setclient/modules/trace/add/index?ownertable=sa_customers&ownerid=${data.sa_customersid}`,
-                })
+                that.selectComponent("#Trace").insetr();
                 break;
             case "编辑":
                 data.parentid = data.superiorenterprisename ? [data.superiorenterprisename, [data.parentid]] : "";

+ 1 - 2
packageA/publicCustomer/detail.json

@@ -1,7 +1,7 @@
 {
     "usingComponents": {
         "Info": "../setclient/modules/information/index",
-        "Trace": "../setclient/modules/trace/index",
+        "Trace": "/pages/trace/index",
         "Preview": "../setclient/modules/preview/index",
         "Contacts": "../setclient/modules/contacts/index",
         "Address": "../setclient/modules/address/index",
@@ -15,7 +15,6 @@
         "Account": "/packageA/setclient/modules/account/index",
         "Contract": "/packageA/setclient/modules/contract/index",
         "Offers": "/packageA/setclient/modules/offers/index"
-
     },
     "navigationBarTitleText": "客户详情"
 }

+ 48 - 48
packageA/publicCustomer/detail.wxml

@@ -1,67 +1,67 @@
 <!-- 头部 样式使用list样式 -->
 <view class="setclient-list-item" url="#">
-	<view class="con">
-		<view class="portrait {{detail.enterprisename <=2?'min-portrait':''}}">{{handle.getName(detail.enterprisename)}}</view>
-		<view class="mian">
-			<view class="label line-1">{{detail.enterprisename}}</view>
-			<view class="tag-box">
-				<Yl-tags id="Tags" add ownertable='sa_customers' bind:onGetList='onGetList' ownerid='{{detail.sa_customersid}}' />
-			</view>
-		</view>
-		<view class="extend">
-			<!-- <Info /> -->
-		</view>
-	</view>
+    <view class="con">
+        <view class="portrait {{detail.enterprisename <=2?'min-portrait':''}}">{{handle.getName(detail.enterprisename)}}</view>
+        <view class="mian">
+            <view class="label line-1">{{detail.enterprisename}}</view>
+            <view class="tag-box">
+                <Yl-tags id="Tags" add ownertable='sa_customers' bind:onGetList='onGetList' ownerid='{{detail.sa_customersid}}' />
+            </view>
+        </view>
+        <view class="extend">
+            <!-- <Info /> -->
+        </view>
+    </view>
 </view>
 <!-- 简介 -->
 <Yl_Detail list="{{briefs}}" />
 <view style="height: 20rpx;" />
 <!-- 功能 -->
 <Yl_FunTabs list='{{tabsList}}' active='{{tabsActive}}' bind:onChenge="tabsChange">
-	<Trace slot='跟进动态' id='Trace' ownertable='sa_customers' ownerid='{{detail.sa_customersid}}' />
-	<Preview slot='详细信息' list1='{{list1}}' list2='{{list2}}' />
-	<Work slot='任务' id='Work' ownertable='sa_customers' ownerid='{{detail.sa_customersid}}' disabled="{{isAdmin}}" />
-	<Address slot='客户地址' id='Address' disabled="{{per.query(options,'address')||isAdmin}}" />
-	<Contacts slot='联系人' id='Contacts' disabled="{{per.query(options,'contact')||isAdmin}}" path='/packageA/setclient/modules/contacts/quickly/index' enterprisename='{{detail.enterprisename}}' />
-	<Project slot='项目商机' id="Project" />
-	<Clue slot='关联线索' id='Clue' disabled="{{false}}" />
-	<Offers slot='报价单' id='Offers' disabled="{{per.query(options,'offer')||isAdmin||isLeader}}" />
-	<Contract slot='合同' id='Contract' />
-	<Account slot='账户余额' id='Account' />
-	<Bankcard slot='银行卡信息' id="Bankcard" />
-	<Financing slot='开票信息' id="Financing" disabled="{{per.query(options,'invoice')||isAdmin}}" />
-	<Record slot="操作" id="Record" ownertable='sa_customers' ownerid='{{detail.sa_customersid}}' />
-	<Files slot="附件" id="Files" ownertable='sa_customers' ownerid='{{detail.sa_customersid}}' />
-	<view style="height: 140rpx;" />
+    <Trace slot='跟进动态' id='Trace' ownertable='sa_customers' ownerid='{{sa_customersid}}' ownerid1='{{detail.sys_enterpriseid}}' />
+    <Preview slot='详细信息' list1='{{list1}}' list2='{{list2}}' />
+    <Work slot='任务' id='Work' ownertable='sa_customers' ownerid='{{detail.sa_customersid}}' disabled="{{isAdmin}}" />
+    <Address slot='客户地址' id='Address' disabled="{{per.query(options,'address')||isAdmin}}" />
+    <Contacts slot='联系人' id='Contacts' disabled="{{per.query(options,'contact')||isAdmin}}" path='/packageA/setclient/modules/contacts/quickly/index' enterprisename='{{detail.enterprisename}}' />
+    <Project slot='项目商机' id="Project" />
+    <Clue slot='关联线索' id='Clue' disabled="{{false}}" />
+    <Offers slot='报价单' id='Offers' disabled="{{per.query(options,'offer')||isAdmin||isLeader}}" />
+    <Contract slot='合同' id='Contract' />
+    <Account slot='账户余额' id='Account' />
+    <Bankcard slot='银行卡信息' id="Bankcard" />
+    <Financing slot='开票信息' id="Financing" disabled="{{per.query(options,'invoice')||isAdmin}}" />
+    <Record slot="操作" id="Record" ownertable='sa_customers' ownerid='{{detail.sa_customersid}}' />
+    <Files slot="附件" id="Files" ownertable='sa_customers' ownerid='{{detail.sa_customersid}}' />
+    <view style="height: 140rpx;" />
 </Yl_FunTabs>
 <!-- 底部 -->
 <Yl_Tabbar list='{{tabbarList}}' bind:callback="tabbarOnClick" />
 <!-- 处理四字 -->
 <wxs module="handle">
-	module.exports.getName = function (name) {
-		return name.substring(0, 4)
-	};
+    module.exports.getName = function (name) {
+        return name.substring(0, 4)
+    };
 </wxs>
 <wxs src='../../utils/wxmlQueryPer.wxs' module="per" />
 
 <!-- 查重 -->
 <van-popup show="{{ repetitionShow }}" custom-class='popup' round position="bottom" custom-style="height: 100%;" bind:close="repClose">
-	<view class="title">
-		查重
-		<van-icon custom-class='icon' size='40rpx' name="cross" bindtap="repClose" />
-	</view>
-	<navigator url="#" class="enterprise" wx:for="{{repetitionList}}" wx:key="sys_enterpriseid" data-item="{{item}}" bindtap="toRepDetail">
-		<view class="enterprise_title">{{item.enterprisename||" --"}}</view>
-		<view class="tag-box">
-			<van-tag custom-class='tag' wx:for="{{item.tag_sys}}" wx:key="index" wx:for-item='tag' color='#3874f6' text-color='#fff' round>{{tag}}</van-tag>
-			<van-tag custom-class='tag' wx:for="{{item.tag}}" wx:key="index" wx:for-item='tag' color='#FA8C16' text-color='#fff' round>{{tag}}</van-tag>
-		</view>
-		<view class="exp">客户地址:{{item.address||" --"}}</view>
-		<view class="exp">企业税号:{{item.taxno||" --"}}</view>
-		<view class="exp">客户类型:{{item.type||" --"}}</view>
-		<view class="exp">负责人:{{item.leader[0].name||" --"}}</view>
-		<view class="exp">手机号:{{item.phonenumber||" --"}}</view>
-		<view class="exp">成交状态:{{item.tradingstatus||" --"}}</view>
-		<view class="exp">最近跟进时间:{{item.followdate||" --"}}</view>
-	</navigator>
+    <view class="title">
+        查重
+        <van-icon custom-class='icon' size='40rpx' name="cross" bindtap="repClose" />
+    </view>
+    <navigator url="#" class="enterprise" wx:for="{{repetitionList}}" wx:key="sys_enterpriseid" data-item="{{item}}" bindtap="toRepDetail">
+        <view class="enterprise_title">{{item.enterprisename||" --"}}</view>
+        <view class="tag-box">
+            <van-tag custom-class='tag' wx:for="{{item.tag_sys}}" wx:key="index" wx:for-item='tag' color='#3874f6' text-color='#fff' round>{{tag}}</van-tag>
+            <van-tag custom-class='tag' wx:for="{{item.tag}}" wx:key="index" wx:for-item='tag' color='#FA8C16' text-color='#fff' round>{{tag}}</van-tag>
+        </view>
+        <view class="exp">客户地址:{{item.address||" --"}}</view>
+        <view class="exp">企业税号:{{item.taxno||" --"}}</view>
+        <view class="exp">客户类型:{{item.type||" --"}}</view>
+        <view class="exp">负责人:{{item.leader[0].name||" --"}}</view>
+        <view class="exp">手机号:{{item.phonenumber||" --"}}</view>
+        <view class="exp">成交状态:{{item.tradingstatus||" --"}}</view>
+        <view class="exp">最近跟进时间:{{item.followdate||" --"}}</view>
+    </navigator>
 </van-popup>

+ 144 - 0
packageA/select/linkman/select.js

@@ -0,0 +1,144 @@
+const _Http = getApp().globalData.http;
+
+Page({
+    data: {
+        params: {}, //请求体
+        result: [], //返回结果
+        radio: false, //是否为单选
+        idname: "contactsid", //idkey
+        showName: "name", //表单用 显示名称
+    },
+    onLoad(options) {
+        if (options.params) {
+            let params = JSON.parse(options.params);
+            if (!params.content.pageNumber || !params.content.pageTotal) {
+                params.content.pageNumber = 1;
+                params.content.pageTotal = 1;
+            }
+            this.setData({
+                params
+            });
+        }
+        if (options.title) wx.setNavigationBarTitle({
+            title: options.title,
+        })
+        this.setData({
+            radio: options.radio ? true : false,
+            idname: options.idname || this.data.idname,
+            showName: options.showName || this.data.showName,
+            result: (!options.result || options.result == 'undefined') ? [] : JSON.parse(options.result)
+        });
+        this.getList()
+    },
+    getList(init = false) {
+        //init 用于初始化分页
+        if (init.detail != undefined) init = init.detail;
+        let params = this.data.params;
+        if (init) params.content.pageNumber = 1;
+        if (params.content.pageNumber > params.content.pageTotal) return;
+        _Http.basic(params).then(res => {
+            console.log("选择联系人列表", res)
+            this.selectComponent('#ListBox').RefreshToComplete();
+            if (res.msg != '成功') return wx.showToast({
+                title: res.data,
+                icon: "none"
+            })
+            if (params.excludeid) res.data = res.data.filter(v => v[this.data.idname] != params.excludeid);
+            this.setData({
+                'params.content.pageNumber': res.pageNumber + 1,
+                'params.content.pageTotal': res.pageTotal,
+                'params.content.total': res.total,
+            })
+
+            this.getTags(res.data, res.pageNumber)
+
+        })
+    },
+    /* 获取列表标签 */
+    getTags(list, pageNumber) {
+        let ownerids = list.map(v => v.contactsid);
+        _Http.basic({
+            "id": 20221018102001,
+            "content": {
+                nocache: true,
+                "ownertable": "plm_unit",
+                ownerids
+            }
+        }).then(res => {
+            console.log("标签", res)
+            for (let key in res.data) {
+                let index = list.findIndex(v => v.contactsid == key);
+                list[index].tags = res.data[key]
+            };
+            this.setData({
+                list: pageNumber == 1 ? list : this.data.list.concat(list)
+            })
+        })
+    },
+    /* 删除项 */
+    deteleItem(id) {
+        this.setData({
+            list: this.data.list.filter(v => v[this.data.idname] != id),
+            "params.content.total": this.data.params.content.total - 1
+        })
+    },
+    /* 选中 */
+    changeResult(e) {
+        let {
+            id
+        } = e.currentTarget.dataset, result = this.data.result;
+        if (this.data.radio) {
+            result = [id];
+        } else {
+            result.some(v => v == id) ? result = result.filter(v => v != id) : result.push(id)
+        }
+        this.setData({
+            result
+        });
+        if (this.data.radio) this.submit();
+    },
+    /* 提交 */
+    submit() {
+        let result = this.data.result,
+            obj = this.data.radio ? {
+                id: result,
+                item: this.data.list.find(value => value[this.data.idname] == result),
+                value: [this.data.list.find(value => value[this.data.idname] == result)[this.data.showName], result]
+            } : {
+                result,
+                list: result.map(v => this.data.list.find(value => value[this.data.idname] == v)),
+                value: [result.map(v => {
+                    let data = this.data.list.find(value => value[this.data.idname] == v);
+                    return data ? data[this.data.showName] : ""
+                }), result]
+            }
+        getApp().globalData.handleSelect && getApp().globalData.handleSelect(obj)
+    },
+    /* 开始搜索 */
+    startSearch({
+        detail
+    }) {
+        let condition = this.data.content ? this.data.content.where.condition : this.data.params.content.where.condition;
+        if (detail == condition) return;
+        this.setData({
+            'content.where.condition': detail,
+            'params.content.where.condition': detail
+        });
+        this.getList(true);
+    },
+    /* 取消搜索 */
+    onClear() {
+        this.setData({
+            'content.where.condition': "",
+            'params.content.where.condition': ""
+        });
+        this.getList(true);
+    },
+    onReady() {
+        this.selectComponent("#ListBox").setHeight(".head", this);
+    },
+    onUnload() {
+        //回收数据
+        getApp().globalData.handleSelect = null;
+    }
+})

+ 4 - 0
packageA/select/linkman/select.json

@@ -0,0 +1,4 @@
+{
+    "usingComponents": {},
+    "navigationBarTitleText": "选择联系人"
+}

+ 95 - 0
packageA/select/linkman/select.scss

@@ -0,0 +1,95 @@
+.offer-list {
+    display: flex;
+    align-items: center;
+    width: 100%;
+    padding: 20rpx 30rpx;
+    box-sizing: border-box;
+    background-color: #fff;
+    border-bottom: 1rpx solid #ddd;
+    font-family: PingFang SC-Regular, PingFang SC;
+
+    .portrait {
+        width: 80rpx;
+        height: 80rpx;
+        background: #3874F6;
+        border-radius: 50%;
+        text-align: center;
+        line-height: 80rpx;
+        font-size: 28rpx;
+        font-family: PingFang SC-Regular, PingFang SC;
+        color: #FFFFFF;
+        flex-shrink: 0;
+
+        margin-right: 20rpx;
+    }
+
+
+
+    .box {
+        flex: 1;
+
+
+        .title {
+            display: flex;
+            height: 42rpx;
+            align-items: center;
+            font-size: 30rpx;
+
+            .tag {
+                font-size: 20rpx;
+                font-family: PingFang SC-Regular, PingFang SC;
+                margin-left: 8rpx !important;
+            }
+        }
+
+
+        .exp {
+            height: 34rpx;
+            font-size: 24rpx;
+            color: #666;
+            margin-top: 8rpx;
+
+            text {
+                color: #333333;
+            }
+        }
+    }
+
+
+}
+
+page {
+    height: 100vh;
+    overflow: hidden;
+}
+
+.footer {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    padding: 0 30rpx;
+    position: fixed;
+    width: 100vw;
+    height: 130rpx;
+    background: #FFFFFF;
+    box-shadow: 0px -4rpx 16rpx 2rpx rgba(150, 157, 165, 0.16);
+    bottom: 0;
+    box-sizing: border-box;
+
+    .count {
+        font-size: 28rpx;
+        font-family: PingFang SC-Regular, PingFang SC;
+        color: #333333;
+    }
+
+    .but {
+        width: 156rpx;
+        height: 90rpx;
+        background: #3874F6;
+        border-radius: 8rpx;
+        font-size: 28rpx;
+        font-family: PingFang SC-Bold, PingFang SC;
+        font-weight: bold;
+        color: #FFFFFF;
+    }
+}

+ 38 - 0
packageA/select/linkman/select.wxml

@@ -0,0 +1,38 @@
+<van-search class="search" value="{{ params.content.where.condition }}" shape="round" placeholder="请输入搜索关键词" bind:search='startSearch' bind:clear='onClear' />
+<view class="head" style="height: 20rpx;" />
+<Yl_ListBox id='ListBox' bind:getlist='getList'>
+    <navigator class="offer-list" url="#" wx:for="{{list}}" wx:key="index" data-id="{{item[idname]}}" bindtap="changeResult">
+        <view class="portrait">
+                {{item[showName][0]}}
+            </view>
+        <view class="box">
+            <view class="title line-1">
+                {{item[showName]||'--'}}
+                <van-tag custom-class='tag' wx:for="{{item.tags.systemtag}}" wx:for-item='tag' color='#FA8C16' text-color='#fff' round>{{tag}}</van-tag>
+                <van-tag custom-class='tag' wx:for="{{item.tags.datatag}}" wx:for-item='tag' color='#FAAB16' text-color='#fff' round>{{tag}}</van-tag>
+            </view>
+            <view class="exp">{{item.phonenumber}}</view>
+        </view>
+        <van-checkbox wx:if="{{!radio}}" value="{{ handle.isCheck(item[idname],result) }}" shape="square" icon-size='28rpx' />
+    </navigator>
+    <view style="height: 230rpx;" />
+    <My_empty wx:if="{{!list.length}}" />
+</Yl_ListBox>
+<block wx:if="{{!radio}}">
+    <view style="height: 130rpx;" />
+    <view class="footer">
+        <view class="count">
+            已选:{{result.length}}
+        </view>
+        <van-button custom-class='but' disabled='{{result.length==0}}' bind:click="submit">添加</van-button>
+    </view>
+</block>
+<wxs module="handle">
+    module.exports = {
+        isCheck: function (id, list) {
+            return list.some(function (v) {
+                return v == id
+            });
+        }
+    }
+</wxs>

+ 1 - 3
packageA/setclient/detail.js

@@ -123,9 +123,7 @@ Page({
                 getApp().globalData.handleSelect = this.handleTransfer.bind(this);
                 break;
             case "跟进":
-                wx.navigateTo({
-                    url: `/packageA/setclient/modules/trace/add/index?ownertable=sa_customers&ownerid=${data.sa_customersid}`,
-                })
+                that.selectComponent("#Trace").insetr();
                 break;
             case "编辑":
                 data.parentid = data.superiorenterprisename ? [data.superiorenterprisename, [data.parentid]] : "";

+ 1 - 1
packageA/setclient/detail.json

@@ -1,7 +1,7 @@
 {
     "usingComponents": {
         "Info": "./modules/information/index",
-        "Trace": "./modules/trace/index",
+        "Trace": "/pages/trace/index",
         "Preview": "./modules/preview/index",
         "Address": "./modules/address/index",
         "Contacts": "./modules/contacts/index",

+ 51 - 51
packageA/setclient/detail.wxml

@@ -1,72 +1,72 @@
-<import src="detail.skeleton.wxml"/>
+<import src="detail.skeleton.wxml" />
 <template is="skeleton" wx:if="{{loading}}" />
 
 <!-- 头部 样式使用list样式 -->
 <view class="setclient-list-item" url="#">
-	<view class="con">
-		<view class="portrait {{detail.enterprisename <=2?'min-portrait':''}}">{{handle.getName(detail.enterprisename)}}</view>
-		<view class="mian">
-			<view class="label line-1">{{detail.enterprisename}}</view>
-			<view class="tag-box">
-				<Yl-tags id="Tags" add ownertable='sa_customers' bind:onGetList='onGetList' ownerid='{{sa_customersid}}' />
-			</view>
-		</view>
-		<view class="extend">
-			<!-- <Info /> -->
-		</view>
-	</view>
+    <view class="con">
+        <view class="portrait {{detail.enterprisename <=2?'min-portrait':''}}">{{handle.getName(detail.enterprisename)}}</view>
+        <view class="mian">
+            <view class="label line-1">{{detail.enterprisename}}</view>
+            <view class="tag-box">
+                <Yl-tags id="Tags" add ownertable='sa_customers' bind:onGetList='onGetList' ownerid='{{sa_customersid}}' />
+            </view>
+        </view>
+        <view class="extend">
+            <!-- <Info /> -->
+        </view>
+    </view>
 </view>
 <!-- 简介 -->
 <Yl_Detail list="{{briefs}}">
-	<!-- 团队管理 -->
-	<Yl-group id='Group' slot='bottom' add ownertable='sa_customers' ownerid='{{sa_customersid}}' />
+    <!-- 团队管理 -->
+    <Yl-group id='Group' slot='bottom' add ownertable='sa_customers' ownerid='{{sa_customersid}}' />
 </Yl_Detail>
 <view style="height: 20rpx;" />
 <!-- 功能 -->
 <Yl_FunTabs list='{{tabsList}}' active='{{tabsActive}}' bind:onChenge="tabsChange">
-	<Trace slot='跟进动态' id='Trace' ownertable='sa_customers' ownerid='{{sa_customersid}}' />
-	<Work slot='任务' id='Work' ownertable='sa_customers' ownerid='{{sa_customersid}}' disabled="{{isAdmin||isLeader}}" />
-	<Project slot='项目商机' id="Project" />
-	<Preview slot='详细信息' list1='{{list1}}' list2='{{list2}}' />
-	<Clue slot='关联线索' id='Clue' disabled="{{false}}" />
-	<Address slot='客户地址' id='Address' disabled="{{per.query(options,'address')||isAdmin||isLeader}}" />
-	<Contacts slot='联系人' id='Contacts' disabled="{{per.query(options,'contact')||isAdmin||isLeader}}" path='/packageA/setclient/modules/contacts/quickly/index' enterprisename='{{detail.enterprisename}}' />
-	<Offers slot='报价单' id='Offers' disabled="{{per.query(options,'offer')||isAdmin||isLeader}}" />
-	<Contract slot='合同' id='Contract' />
-	<Account slot='账户余额' id='Account' />
-	<Bankcard slot='银行卡信息' id="Bankcard" />
-	<Financing slot='开票信息' id="Financing" disabled="{{per.query(options,'invoice')||isAdmin||isLeader}}" />
-	<Record slot="操作" id="Record" ownertable='sa_customers' ownerid='{{sa_customersid}}' />
-	<Files slot="附件" id="Files" ownertable='sa_customers' ownerid='{{sa_customersid}}' />
-	<view style="height: 140rpx;" />
+    <Trace slot='跟进动态' id='Trace' ownertable='sa_customers' ownerid='{{sa_customersid}}' ownerid1='{{detail.sys_enterpriseid}}' />
+    <Work slot='任务' id='Work' ownertable='sa_customers' ownerid='{{sa_customersid}}' disabled="{{isAdmin||isLeader}}" />
+    <Project slot='项目商机' id="Project" />
+    <Preview slot='详细信息' list1='{{list1}}' list2='{{list2}}' />
+    <Clue slot='关联线索' id='Clue' disabled="{{false}}" />
+    <Address slot='客户地址' id='Address' disabled="{{per.query(options,'address')||isAdmin||isLeader}}" />
+    <Contacts slot='联系人' id='Contacts' disabled="{{per.query(options,'contact')||isAdmin||isLeader}}" path='/packageA/setclient/modules/contacts/quickly/index' enterprisename='{{detail.enterprisename}}' />
+    <Offers slot='报价单' id='Offers' disabled="{{per.query(options,'offer')||isAdmin||isLeader}}" />
+    <Contract slot='合同' id='Contract' />
+    <Account slot='账户余额' id='Account' />
+    <Bankcard slot='银行卡信息' id="Bankcard" />
+    <Financing slot='开票信息' id="Financing" disabled="{{per.query(options,'invoice')||isAdmin||isLeader}}" />
+    <Record slot="操作" id="Record" ownertable='sa_customers' ownerid='{{sa_customersid}}' />
+    <Files slot="附件" id="Files" ownertable='sa_customers' ownerid='{{sa_customersid}}' />
+    <view style="height: 140rpx;" />
 </Yl_FunTabs>
 <!-- 底部 -->
 <Yl_Tabbar wx:if="{{tabbarList.length}}" list='{{tabbarList}}' bind:callback="tabbarOnClick" />
 <!-- 处理四字 -->
 <wxs module="handle">
-	module.exports.getName = function (name) {
-		return name.substring(0, 4)
-	};
+    module.exports.getName = function (name) {
+        return name.substring(0, 4)
+    };
 </wxs>
 <!-- 查重 -->
 <van-popup show="{{ repetitionShow }}" custom-class='popup' round position="bottom" custom-style="height: 100%;" bind:close="repClose">
-	<view class="title">
-		查重
-		<van-icon custom-class='icon' size='40rpx' name="cross" bindtap="repClose" />
-	</view>
-	<navigator url="#" class="enterprise" wx:for="{{repetitionList}}" wx:key="sys_enterpriseid" data-item="{{item}}" bindtap="toRepDetail">
-		<view class="enterprise_title">{{item.enterprisename||" --"}}</view>
-		<view class="tag-box">
-			<van-tag custom-class='tag' wx:for="{{item.tag_sys}}" wx:key="index" wx:for-item='tag' color='#3874f6' text-color='#fff' round>{{tag}}</van-tag>
-			<van-tag custom-class='tag' wx:for="{{item.tag}}" wx:key="index" wx:for-item='tag' color='#FA8C16' text-color='#fff' round>{{tag}}</van-tag>
-		</view>
-		<view class="exp">客户地址:{{item.address||" --"}}</view>
-		<view class="exp">企业税号:{{item.taxno||" --"}}</view>
-		<view class="exp">客户类型:{{item.type||" --"}}</view>
-		<view class="exp">负责人:{{item.leader[0].name||" --"}}</view>
-		<view class="exp">手机号:{{item.phonenumber||" --"}}</view>
-		<view class="exp">成交状态:{{item.tradingstatus||" --"}}</view>
-		<view class="exp">最近跟进时间:{{item.followdate||" --"}}</view>
-	</navigator>
+    <view class="title">
+        查重
+        <van-icon custom-class='icon' size='40rpx' name="cross" bindtap="repClose" />
+    </view>
+    <navigator url="#" class="enterprise" wx:for="{{repetitionList}}" wx:key="sys_enterpriseid" data-item="{{item}}" bindtap="toRepDetail">
+        <view class="enterprise_title">{{item.enterprisename||" --"}}</view>
+        <view class="tag-box">
+            <van-tag custom-class='tag' wx:for="{{item.tag_sys}}" wx:key="index" wx:for-item='tag' color='#3874f6' text-color='#fff' round>{{tag}}</van-tag>
+            <van-tag custom-class='tag' wx:for="{{item.tag}}" wx:key="index" wx:for-item='tag' color='#FA8C16' text-color='#fff' round>{{tag}}</van-tag>
+        </view>
+        <view class="exp">客户地址:{{item.address||" --"}}</view>
+        <view class="exp">企业税号:{{item.taxno||" --"}}</view>
+        <view class="exp">客户类型:{{item.type||" --"}}</view>
+        <view class="exp">负责人:{{item.leader[0].name||" --"}}</view>
+        <view class="exp">手机号:{{item.phonenumber||" --"}}</view>
+        <view class="exp">成交状态:{{item.tradingstatus||" --"}}</view>
+        <view class="exp">最近跟进时间:{{item.followdate||" --"}}</view>
+    </navigator>
 </van-popup>
 <wxs src='../../utils/wxmlQueryPer.wxs' module="per" />

+ 2 - 2
packageA/setclient/modules/trace/detail/index.js

@@ -11,7 +11,7 @@ Page({
             label: "编辑"
         }, {
             icon: "icon-shanchu",
-            label: "作废"
+            label: "删除"
         }]
     },
     onLoad(options) {
@@ -58,7 +58,7 @@ Page({
                     url: `/packageA/setclient/modules/trace/add/index?ownertable=${this.data.ownertable}&ownerid=${this.data.ownerid}&sys_datafollowupid=${item.sys_datafollowupid}`
                 });
                 break;
-            case "作废":
+            case "删除":
                 wx.navigateTo({
                     url: `/packageA/setclient/modules/trace/list/delete?item=${JSON.stringify({
                     "sys_datafollowupid": item.sys_datafollowupid,

+ 7 - 8
packageA/setclient/modules/trace/list/delete.js

@@ -23,17 +23,14 @@ Page({
             }
         }).then(res => {
             console.log("删除", res);
-            if (res.msg != '成功') return wx.showToast({
-                title: res.msg,
-                icon: "none"
-            });
             wx.showToast({
-                title: '作废成功',
+                title: res.msg != '成功' ? res.msg : "删除成功",
                 icon: "none"
-            })
+            });
+            if (res.msg != '成功') return;
             getCurrentPages().forEach(v => {
                 //如果页面历史有详情,退出详情
-                if (['packageA/setclient/modules/trace/detail/index'].includes(v.__route__)) wx.navigateBack();
+                if (['packageA/setclient/modules/trace/detail/index', "pages/trace/detail"].includes(v.__route__)) wx.navigateBack();
                 //如果页面历史有列表页 刷新列表
                 if (v.selectComponent("#Trace")) {
                     let page = v.selectComponent("#Trace")
@@ -43,7 +40,9 @@ Page({
                     page.changeTotal()
                 }
             });
-            wx.navigateBack();
+            setTimeout(() => {
+                wx.navigateBack();
+            }, 500)
         })
     }
 })

+ 1 - 1
packageA/setclient/modules/trace/list/delete.json

@@ -1,4 +1,4 @@
 {
     "usingComponents": {},
-    "navigationBarTitleText": "作废原因"
+    "navigationBarTitleText": "删除原因"
 }

+ 2 - 2
packageA/setclient/modules/trace/list/delete.wxml

@@ -1,9 +1,9 @@
 <view class="box">
     <view class="title">
-        <text>*</text>请说明作废原因
+        <text>*</text>请说明删除原因
     </view>
     <view class="content">
-        <textarea placeholder="请说明作废原因" value="{{deletereason}}" bindinput="onInput" />
+        <textarea placeholder="请说明删除原因" value="{{deletereason}}" bindinput="onInput" />
     </view>
 </view>
 

+ 1 - 1
packageA/setclient/modules/trace/list/index.wxml

@@ -27,7 +27,7 @@
             <text class="iconfont icon-bianji" />编辑
         </navigator>
         <navigator url="#" bindtap="deleteItem" data-item="{{item}}">
-            <text class="iconfont icon-qunzu" />作废
+            <text class="iconfont icon-qunzu" />删除
         </navigator>
     </view>
 </view>

+ 76 - 0
pages/trace/detail.js

@@ -0,0 +1,76 @@
+const _Http = getApp().globalData.http;
+
+Page({
+    data: {
+        ownertable: null,
+        ownerid: null,
+        sys_datafollowupid: null,
+        detail: {},
+        tabbarList: [{
+            icon: "icon-bianji",
+            label: "编辑"
+        }, {
+            icon: "icon-shanchu",
+            label: "删除"
+        }]
+    },
+    onLoad(options) {
+        if (options.data) {
+            this.setData({
+                ...JSON.parse(options.data)
+            })
+            this.getDetail();
+        }
+    },
+    getDetail() {
+        _Http.basic({
+            "id": 20221026085601,
+            "content": {
+                "sys_datafollowupid": this.data.sys_datafollowupid
+            }
+        }).then(res => {
+            console.log("跟进详情", res)
+            if (res.msg != '成功') return wx.showToast({
+                title: res.data,
+                icon: "none"
+            })
+
+            res.data.names = res.data.contacts.map(n => n.name)
+            this.selectComponent("#Yl_files").handleFiles(res.data.attinfos)
+            this.setData({
+                detail: res.data,
+                briefs: [{
+                    label: "跟进对象",
+                    value: res.data.names
+                }, {
+                    label: "跟进类型",
+                    value: res.data.type
+                }, {
+                    label: "跟进内容",
+                    value: res.data.content
+                }]
+            })
+        })
+    },
+    /* tab 切换回调 */
+    tabbarOnClick({
+        detail
+    }) {
+        const item = this.data.detail;
+        switch (detail.label) {
+            case "编辑":
+                _Http.editItem(item);
+                break;
+            case "删除":
+                wx.navigateTo({
+                    url: `/packageA/setclient/modules/trace/list/delete?item=${JSON.stringify({
+                    "sys_datafollowupid": item.sys_datafollowupid,
+                    "ownertable": this.data.ownertable,
+                    "ownerid": this.data.ownerid
+                })}`,
+                })
+                break;
+        }
+    },
+    onShareAppMessage() {}
+})

+ 4 - 0
pages/trace/detail.json

@@ -0,0 +1,4 @@
+{
+    "usingComponents": {},
+    "navigationBarTitleText": "跟进动态详情"
+}

+ 47 - 0
pages/trace/detail.scss

@@ -0,0 +1,47 @@
+.box {
+    width: 100vw;
+    background-color: #ffffff;
+    box-sizing: border-box;
+    padding: 20rpx 0 0 30rpx;
+
+    .head {
+        display: flex;
+        .portrait {
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            width: 80rpx;
+            height: 80rpx;
+            background: #3874F6;
+            border-radius: 50%;
+            font-size: 28rpx;
+            font-family: PingFang SC-Regular, PingFang SC;
+            color: #FFFFFF;
+            margin-right: 20rpx;
+            flex-shrink: 0;
+        }
+
+        .content {
+            .title {
+                font-size: 30rpx;
+                font-family: PingFang SC-Regular, PingFang SC;
+                color: #333333;
+
+                text {
+                    font-size: 24rpx;
+                    font-family: PingFang SC-Regular, PingFang SC;
+                    color: #999999;
+                    margin-left: 20rpx;
+                }
+            }
+
+            .time {
+                font-size: 24rpx;
+                font-family: PingFang SC-Regular, PingFang SC;
+                color: #999999;
+                margin-top: 8rpx;
+            }
+        }
+
+    }
+}

+ 18 - 0
pages/trace/detail.wxml

@@ -0,0 +1,18 @@
+<view class="box">
+    <view class="head">
+        <view class="portrait">
+            {{detail.createby[0]}}
+        </view>
+        <view class="content">
+            <view class="title">
+                {{detail.createby}}<text>{{detail.userextend[0].position}}</text>
+            </view>
+            <view class="time">{{detail.createdate}}</view>
+        </view>
+    </view>
+</view>
+<view style="background-color: #fff;">
+    <Yl_Detail list="{{briefs}}" />
+    <Yl_Files id="Yl_files" />
+</view>
+<Yl_Tabbar list='{{tabbarList}}' bind:callback="tabbarOnClick" />

+ 148 - 0
pages/trace/index.js

@@ -0,0 +1,148 @@
+const _Http = getApp().globalData.http
+Component({
+    properties: {
+        ownertable: {
+            type: String
+        },
+        ownerid: {
+            type: String
+        },
+        ownerid1: {
+            type: String
+        },
+        disabled: {
+            type: Boolean,
+            value: true
+        }
+    },
+    options: {
+        addGlobalClass: true
+    },
+    data: {
+        content: {
+            nocache: true,
+            pageNumber: 1,
+            pageSize: 10,
+            pageTotal: 1,
+            total: null
+        },
+        list: []
+    },
+    methods: {
+        getList(id, init = false) {
+            let content = {
+                ...this.data.content,
+                "ownertable": this.data.ownertable,
+                "ownerid": this.data.ownerid,
+            };
+            if (init) {
+                content.pageNumber = 1
+                content.pageTotal = 1
+            }
+            _Http.basic({
+                "id": 20220930121501,
+                content
+            }).then(res => {
+                console.log("跟进动态", res)
+                if (res.msg != '成功') return wx.showToast({
+                    title: res.data,
+                    icon: "none"
+                });
+                let list = res.data.map(v => {
+                    try {
+                        v.names = v.contacts.map(n => n.name)
+                    } catch (error) {
+                        v.names = null
+                    }
+                    return v
+                })
+                this.setData({
+                    "content.pageNumber": res.pageNumber + 1,
+                    "content.pageTotal": res.pageTotal,
+                    "content.total": res.total,
+                    list: res.pageNumber == 1 ? list : this.data.list.concat(list)
+                })
+            })
+        },
+        editItem(e) {
+            let item = null;
+            try {
+                item = e.currentTarget.dataset.item;
+            } catch (error) {
+                item = e
+            }
+            let parems = {
+                ownertable: this.data.ownertable,
+                ownerid: this.data.ownerid,
+                ownerid1: this.data.ownerid1,
+                sys_datafollowupid: item.sys_datafollowupid,
+                content: item.content,
+                contactsid: item.names ? [item.names, item.dataextend.contactsid] : "",
+                type: item.type,
+                attinfos: item.attinfos
+            }
+            wx.navigateTo({
+                url: '/pages/trace/insert?parems=' + JSON.stringify(parems),
+            })
+            _Http.changeItem = this.changeItem.bind(this)
+        },
+        changeItem(item) {
+            let list = this.data.list,
+                index = list.findIndex(v => v.sys_datafollowupid == item.sys_datafollowupid);
+            if (index != -1) {
+                list[index] = item;
+            } else {
+                list.unshift(item)
+                this.setData({
+                    "content.total": this.data.content.total += 1
+                })
+            }
+            this.setData({
+                list
+            })
+        },
+        deleteItem(e) {
+            const {
+                item
+            } = e.currentTarget.dataset;
+            wx.navigateTo({
+                url: `/packageA/setclient/modules/trace/list/delete?item=${JSON.stringify({
+                "sys_datafollowupid": item.sys_datafollowupid,
+                "ownertable": this.data.ownertable,
+                "ownerid": this.data.ownerid
+            })}`,
+            })
+        },
+        insetr() {
+            let parems = {
+                ownertable: this.data.ownertable,
+                ownerid: this.data.ownerid,
+                ownerid1: this.data.ownerid1,
+                sys_datafollowupid: 0,
+                content: ""
+            }
+            wx.navigateTo({
+                url: '/pages/trace/insert?parems=' + JSON.stringify(parems),
+            })
+        },
+        toDetail(e) {
+            const {
+                item
+            } = e.currentTarget.dataset;
+            wx.navigateTo({
+                url: `/pages/trace/detail?data=` + JSON.stringify({
+                    "sys_datafollowupid": item.sys_datafollowupid,
+                    "ownertable": this.data.ownertable,
+                    "ownerid": this.data.ownerid
+                }),
+            });
+            _Http.changeItem = this.changeItem.bind(this);
+            _Http.editItem = this.editItem.bind(this);
+        },
+        changeTotal() {
+            this.setData({
+                "content.total": this.data.content.total - 1
+            })
+        }
+    }
+})

+ 5 - 0
pages/trace/index.json

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

+ 148 - 0
pages/trace/index.scss

@@ -0,0 +1,148 @@
+.head {
+    display: flex;
+    align-items: center;
+    width: 100vw;
+    height: 120rpx;
+    padding: 0 20rpx 0 30rpx;
+    box-sizing: border-box;
+
+    .count {
+        font-size: 28rpx;
+        font-family: PingFang SC-Regular, PingFang SC;
+        color: #333333;
+    }
+
+    .expand {
+        flex: 1;
+        display: flex;
+        justify-content: flex-end;
+
+        .but {
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            width: 80rpx;
+            height: 80rpx;
+            background: #FFFFFF;
+            border-radius: 8rpx;
+            border: 2rpx solid #CCCCCC;
+            margin-left: 20rpx;
+            color: #666666;
+        }
+    }
+}
+
+.exp {
+    margin-top: 8rpx;
+    font-size: 24rpx;
+    font-family: PingFang SC-Regular, PingFang SC;
+    color: #333333;
+}
+
+.trace-box {
+    background-color: #ffffff;
+    margin-bottom: 20rpx;
+
+    .item {
+        width: 100vw;
+        padding: 20rpx 30rpx;
+        box-sizing: border-box;
+        border-bottom: 1px solid #DDDDDD;
+
+        .user {
+            display: flex;
+
+            .portrait {
+                width: 80rpx;
+                height: 80rpx;
+                text-align: center;
+                line-height: 80rpx;
+                border-radius: 50%;
+                background-color: #3874F6;
+                font-size: 28rpx;
+                font-family: PingFang SC-Regular, PingFang SC;
+                color: #FFFFFF;
+                margin-right: 20rpx;
+                flex-shrink: 0;
+            }
+
+            .content {
+                .label {
+                    font-size: 30rpx;
+                    font-family: PingFang SC-Regular, PingFang SC;
+                    color: #333333;
+
+                    text {
+                        font-size: 24rpx;
+                        font-family: PingFang SC-Regular, PingFang SC;
+                        color: #999999;
+                    }
+                }
+            }
+
+            .exp {
+                color: #999999;
+            }
+        }
+
+        .text {
+            width: 100%;
+            font-size: 28rpx;
+            font-family: PingFang SC-Regular, PingFang SC;
+            color: #666666;
+            word-break: break-all;
+            margin-top: 20rpx;
+        }
+
+        .type {
+            font-size: 24rpx;
+            font-family: PingFang SC-Regular, PingFang SC;
+            color: #999999;
+            margin-top: 20rpx;
+
+            text {
+                font-size: 24rpx;
+                color: #333333;
+            }
+        }
+    }
+
+    .bottom {
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        width: 100%;
+        height: 70rpx;
+        background: #FFFFFF;
+        box-sizing: border-box;
+        padding: 0 30rpx;
+
+
+        .date {
+            font-size: 24rpx;
+            font-family: PingFang SC-Regular, PingFang SC;
+            color: #999999;
+            margin-top: 6rpx;
+        }
+
+        .but {
+            display: flex;
+
+            navigator {
+                padding: 0 20rpx;
+                line-height: 70rpx;
+
+                .iconfont {
+                    font-size: 28rpx;
+                    color: #999999;
+                    margin-right: 8rpx;
+                }
+
+                font-size: 24rpx;
+                font-family: PingFang SC-Regular,
+                PingFang SC;
+                color: #333333;
+            }
+        }
+    }
+}

+ 53 - 0
pages/trace/index.wxml

@@ -0,0 +1,53 @@
+<view class="head">
+    <view class="count">
+        总共{{content.total}}个
+    </view>
+    <view class="expand">
+        <navigator wx:if="{{disabled}}" url="#" class="but" bindtap="insetr">
+            <van-icon name="plus" />
+        </navigator>
+    </view>
+</view>
+<view class="trace-box" wx:for="{{list}}" wx:key="sys_datafollowupid">
+    <navigator url="#" class="item" data-item="{{item}}" bindtap="toDetail">
+        <view class="user">
+            <view class="portrait">
+                {{item.createby[0]}}
+            </view>
+            <view class="content">
+                <view class="label">
+                    {{item.createby}}
+                </view>
+                <view class="exp">
+                    <text style="margin-right:50rpx;">部门:{{item.userextend[0].depname||' --'}}</text>
+                    <text>职位:{{item.userextend[0].position||' --'}}</text>
+                </view>
+            </view>
+        </view>
+        <view class="line-1" style="display: flex;">
+            <view class="type" style="margin-right: 50rpx;">
+                跟进类型:<text>{{item.type|| ' --'}}</text>
+            </view>
+            <view class="type">
+                跟进对象:<text style="color: #5C8DF8;">{{item.names || ' --'}}</text>
+            </view>
+        </view>
+        <view class="text">
+            {{item.content}}
+        </view>
+    </navigator>
+    <view class="bottom">
+        <view class="date">
+            {{item.createdate}}
+        </view>
+        <view class="but" wx:if="{{disabled}}">
+            <navigator url="#" bindtap="editItem" data-item="{{item}}">
+                <text class="iconfont icon-bianji" />编辑
+            </navigator>
+            <navigator url="#" bindtap="deleteItem" data-item="{{item}}">
+                <text class="iconfont icon-qunzu" />删除
+            </navigator>
+        </view>
+    </view>
+</view>
+<My_empty wx:if="{{list.length==0}}" />

+ 175 - 0
pages/trace/insert.js

@@ -0,0 +1,175 @@
+const _Http = getApp().globalData.http;
+Page({
+    data: {
+        disabled: true,
+        loading: false
+    },
+    onLoad(options) {
+        let parems = JSON.parse(options.parems),
+            form = [{
+                label: "跟进类型",
+                error: false,
+                errMsg: "",
+                type: "option",
+                optionNmae: "datafollowuptype",
+                optionType: "radio", //复选   radio 单选
+                value: "",
+                placeholder: "选择跟进方式",
+                valueName: "type",
+                checking: "base",
+                required: true
+            }, {
+                label: "跟进对象",
+                error: false,
+                errMsg: "",
+                type: "route",
+                url: "/packageA/select/linkman/select",
+                value: "",
+                placeholder: "选择跟进对象",
+                valueName: "contactsid",
+                checking: "base",
+                required: true
+            }];
+        if (parems.ownertable == "sa_project") {
+            form[1].params = {
+                "id": "20221111131004",
+                "content": {
+                    "nocache": true,
+                    "sa_projectid": parems.ownerid,
+                    "pageNumbe": 1,
+                    "pageTotal": 1,
+                    "total": null,
+                    "where": {
+                        "conditino": ""
+                    }
+                }
+            }
+        } else {
+            form[1].params = {
+                "id": "20221022165503",
+                "content": {
+                    "nacache": true,
+                    "pageNumber": 1,
+                    "pageSize": 10,
+                    "pageTotal": 1,
+                    "total": null,
+                    "where": {
+                        "condition": "",
+                        "workaddress": 0
+                    },
+                    "sys_enterpriseid": parems.ownerid1
+                }
+            }
+        }
+        if (parems.sys_datafollowupid != 0) {
+            form[0].value = parems.type;
+            form[1].value = parems.contactsid;
+            if (parems.attinfos.length) this.selectComponent("#Yl_files").handleFiles(parems.attinfos);
+            if (parems.type && parems.contactsid) this.setData({
+                disabled: false
+            })
+        }
+        this.setData({
+            parems,
+            form
+        })
+    },
+    /* 绑定媒体 */
+    insertImgEdit({
+        detail
+    }) {
+        this.handleFileLink(detail)
+    },
+    handleFileLink(attachmentids, ownertable = "temporary", ownerid = 1, data) {
+        _Http.basic({
+            "classname": "system.attachment.Attachment",
+            "method": "createFileLink",
+            "content": {
+                ownertable,
+                ownerid,
+                usetype: 'default',
+                attachmentids
+            }
+        }).then(res => {
+            console.log('跟进记录绑定附件', res)
+            if (res.msg != '成功') return wx.showToast({
+                title: res.msg,
+                icon: "none"
+            })
+            if (ownertable == 'temporary') {
+                this.selectComponent("#Yl_files").handleFiles(res.data)
+            } else {
+                if (res.data.length) data.attinfos = res.data;
+                this.changeItem(data)
+                setTimeout(() => {
+                    wx.navigateBack()
+                }, 500)
+            }
+        })
+    },
+    changeItem(data) {
+        this.setData({
+            loading: false
+        })
+        let page = getCurrentPages()[getCurrentPages().length - 2],
+            isDetail = page.__route__ == 'pages/trace/detail';
+        if (isDetail) {
+            page.getDetail();
+            page = getCurrentPages()[getCurrentPages().length - 3];
+        }
+        if (_Http.changeItem) {
+            _Http.changeItem(data)
+            delete(_Http.changeItem)
+        } else {
+            if (page) {
+                let model = page.selectComponent("#Trace");
+                if (model) model.getList(0, true)
+            }
+        }
+    },
+    //文本域输入
+    onInput(e) {
+        this.setData({
+            "parems.content": e.detail.value || ""
+        })
+    },
+    submit() {
+        this.setData({
+            loading: true
+        })
+        let content = Object.assign(this.data.parems, this.selectComponent("#Form").submit())
+        content.dataextend = {
+            contactsid: content.contactsid[1]
+        }
+        delete(content.contactsid)
+        _Http.basic({
+            "id": 20220930121601,
+            content
+        }).then(res => {
+            console.log("保存跟进内容", res)
+            wx.showToast({
+                title: res.msg != '成功' ? res.msg : content.sys_datafollowupid == 0 ? '保存成功' : '修改成功',
+                icon: "none",
+                mask: res.msg == '成功'
+            });
+            if (res.msg != '成功') return;
+            res.data.names = res.data.contacts.map(n => n.name)
+            let attachmentids = this.selectComponent("#Yl_files").getFiles().attachmentids;
+            if (attachmentids.length) return this.handleFileLink(attachmentids, 'sys_datafollowup', res.data.sys_datafollowupid, res.data);
+            this.changeItem(res.data)
+            setTimeout(() => {
+                wx.navigateBack()
+            }, 500)
+        })
+    },
+    onConfirm({
+        detail
+    }) {
+        this.setData({
+            disabled: detail
+        })
+    },
+    onUnload() {
+        if (this.data.parems.sys_datafollowupid == 0) this.selectComponent("#Yl_files").deleteAll()
+    }
+})

+ 6 - 0
pages/trace/insert.json

@@ -0,0 +1,6 @@
+{
+    "usingComponents": {
+        "My_upload": "/components/My_upload/index"
+    },
+    "navigationBarTitleText": "跟进"
+}

+ 80 - 0
pages/trace/insert.scss

@@ -0,0 +1,80 @@
+.box {
+    width: 100vw;
+    box-sizing: border-box;
+    background-color: #fff;
+    padding-top: 20rpx;
+    margin-top: -30rpx;
+
+    .content {
+        width: 690rpx;
+        border-radius: 8rpx;
+        border: 2rpx solid #CCCCCC;
+        margin-top: 20rpx;
+        box-sizing: border-box;
+        padding-bottom: 20rpx;
+        margin-left: 30rpx;
+        margin-bottom: 20rpx;
+
+
+
+        .upload {
+            display: flex;
+            align-items: center;
+            width: 100%;
+            height: 88rpx;
+            box-sizing: border-box;
+            border-bottom: 2rpx solid #CCCCCC;
+            border-top: 2rpx solid #CCCCCC;
+            background-color: #F4F5F7;
+
+            .title {
+                flex: 1;
+                font-size: 28rpx;
+                font-family: PingFang SC-Regular, PingFang SC;
+                color: #333333;
+                padding-left: 30rpx;
+                font-weight: bold;
+            }
+
+            navigator {
+                width: 100rpx;
+                height: 80rpx;
+                line-height: 80rpx;
+                text-align: center;
+                padding: 0;
+                background-color: #F4F5F7;
+            }
+        }
+
+        .textarea {
+            width: 625rpx;
+            height: 400rpx;
+            margin: 20rpx 0 20rpx 30rpx;
+        }
+
+    }
+}
+
+.footer {
+    display: flex;
+    align-items: center;
+    justify-content: flex-end;
+    position: fixed;
+    width: 750rpx;
+    height: 130rpx;
+    background: #FFFFFF;
+    box-shadow: 0px -4rpx 16rpx 2rpx rgba(150, 157, 165, 0.16);
+    bottom: 0;
+
+    .but {
+        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;
+    }
+}

+ 25 - 0
pages/trace/insert.wxml

@@ -0,0 +1,25 @@
+<Yl_field id='Form' form='{{form}}' bind:onConfirm='onConfirm' />
+<view class="box">
+    <view class="content">
+        <view class="upload">
+            <view class="title">跟进内容</view>
+            <My_upload accept='media' binduploadCallback="insertImgEdit">
+                <navigator url="#">
+                    <text class="iconfont icon-a-tonggaofujian" />
+                </navigator>
+            </My_upload>
+
+            <My_upload accept='file' binduploadCallback="insertImgEdit">
+                <navigator url="#">
+                    <text class="iconfont icon-a-biaoqianlanzhiku" />
+                </navigator>
+            </My_upload>
+        </view>
+        <textarea class="textarea" maxlength='-1' placeholder='请填写' value="{{parems.content}}" bindinput='onInput' />
+    </view>
+    <Yl_Files delete id="Yl_files" />
+</view>
+<view style="height: 130rpx;" />
+<view class="footer">
+    <van-button custom-class='but' disabled='{{disabled || !parems.content.length}}' loading='{{loading}}' bindclick="submit">确定</van-button>
+</view>

+ 7 - 0
project.private.config.json

@@ -14,6 +14,13 @@
                     "query": "",
                     "launchMode": "default",
                     "scene": null
+                },
+                {
+                    "name": "xmsq",
+                    "pathName": "packageA/project/detail",
+                    "query": "id=5214",
+                    "launchMode": "default",
+                    "scene": null
                 }
             ]
         }