zhaoxiaohai 3 лет назад
Родитель
Сommit
b0c5297228

+ 217 - 0
packageA/salesForecasting/detail.js

@@ -0,0 +1,217 @@
+const _Http = getApp().globalData.http;
+Page({
+    data: {
+        tabsActive: 1, //tabs 选中项
+        sa_salesforecastbillid: "",
+        tabsList: [{
+            label: "详细信息",
+            num: 132
+        }, {
+            label: "项目产品清单",
+            num: 132
+        }, {
+            label: "跟进动态",
+            num: 132
+        }, {
+            label: "操作记录",
+            num: 132
+        }, {
+            label: "附件",
+            num: 132
+        }],
+        tabbarList: [{
+            icon: "icon-genjin",
+            label: "跟进"
+        }, {
+            icon: "icon-shanchu",
+            label: "作废"
+        }],
+    },
+    onLoad(options) {
+        this.setData({
+            sa_salesforecastbillid: options.sa_salesforecastbillid
+        });
+        this.getDetail();
+    },
+    getDetail() {
+        _Http.basic({
+            "id": 20220914104603,
+            "version": 1,
+            "content": {
+                "sa_salesforecastbillid": this.data.sa_salesforecastbillid
+            },
+        }).then(res => {
+            console.log("预测详情", res)
+            res.data = res.data[0];
+            if (res.msg != '成功') return wx.showToast({
+                title: res.msg,
+                icon: "none"
+            });
+            this.setData({
+                detail: res.data,
+                briefs: [{
+                    label: "提报开始时间",
+                    value: '123'
+                }, {
+                    label: "提报周期",
+                    value: res.data.periodpoint
+                }, {
+                    label: "提报要求",
+                    value: res.data.remarks
+                }, {
+                    label: "预测金额",
+                    value: res.data.sumamount
+                }, {
+                    label: "状态",
+                    value: res.data.status
+                }],
+                list1: [{
+                    label: "单号",
+                    value: res.data.billnum
+                }, {
+                    label: "提报要求",
+                    value: res.data.remarks
+                }, {
+                    label: "提报开始时间",
+                    value: '暂时没有'
+                }, {
+                    label: "提报周期",
+                    value: res.data.periodpoint
+                }, {
+                    label: "预测金额(元)",
+                    value: "sumamount"
+                }, {
+                    label: "负责人",
+                    value: res.data.createby
+                }],
+                list2: [{
+                    label: "创建人",
+                    value: res.data.createby
+                }, {
+                    label: "创建时间",
+                    value: res.data.createdate
+                }, {
+                    label: "最近编辑人",
+                    value: res.data.changeby
+                }, {
+                    label: "最近编辑时间",
+                    value: res.data.changedate
+                }],
+                tabsList: this.data.tabsList
+            });
+            this.getTags();
+            this.getGroup();
+            this.partialRenewal();
+        })
+    },
+    //tabs 切换
+    tabsChange({
+        detail
+    }) {
+        this.setData({
+            tabsActive: detail
+        });
+        this.partialRenewal();
+    },
+    //局部数据更新 tabs
+    partialRenewal(init = false) {
+        let id = this.data.sa_salesforecastbillid;
+        let model = '';
+        let name = this.data.tabsList[this.data.tabsActive].label;
+        switch (name) {
+            case "项目产品清单":
+                model = "#Project"
+                break;
+            case "跟进动态":
+                model = "#Trace"
+                break;
+            case "操作记录":
+                model = "#Record"
+                break;
+            case "附件":
+                model = "#Files"
+                break;
+        };
+        if (model) {
+            // 确定好模块ID total = null 是第一次加载 加载数据
+            // init是新增或修改需要清数据
+            let Component = this.selectComponent(model);
+            const {
+                total,
+                pageNumber,
+                pageTotal
+            } = Component.data.content;
+            if (model == "#Project") {
+                total == null ? Component.getList(id, init) : Component.getProduct()
+            } else {
+                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;
+        switch (detail.label) {
+            case "跟进":
+                wx.navigateTo({
+                    url: `/packageA/setclient/modules/trace/add/index?ownertable=sa_salesforecastbill&ownerid=${data.sa_salesforecastbillid}`,
+                })
+                break;
+            case "作废":
+                wx.showModal({
+                    title: '提示',
+                    content: '是否确认作废该预测?',
+                    complete: ({
+                        confirm
+                    }) => {
+                        if (confirm) _Http.basic({
+                            "id": 20221020165503,
+                            "version": 1,
+                            "content": {
+                                "sa_salesforecastbillids": [this.data.detail.sa_salesforecastbillid]
+                            }
+                        }).then(res => {
+                            wx.showToast({
+                                title: res.msg == '成功' ? '已作废预测' : res.msg,
+                                icon: "none"
+                            });
+                            if (res.msg == '成功') {
+                                setTimeout(() => {
+                                    getCurrentPages().forEach(v => {
+                                        if (v.__route__ == 'packageA/offers/index') {
+                                            v.setData({
+                                                list: v.data.list.filter(value => value.sa_salesforecastbillid != this.data.detail.sa_salesforecastbillid),
+                                                'content.total': v.data.content.total - 1
+                                            })
+                                        }
+                                    })
+                                    wx.navigateBack();
+                                }, 300)
+                            }
+                        })
+                    }
+                })
+                break;
+        }
+    },
+    //更新标签
+    getTags() {
+        this.selectComponent("#Tags").getTags();
+    },
+    //更新团队成员
+    getGroup() {
+        this.selectComponent("#Group").getList();
+    },
+    onShareAppMessage() {}
+})

+ 10 - 0
packageA/salesForecasting/detail.json

@@ -0,0 +1,10 @@
+{
+    "usingComponents": {
+        "Preview": "../setclient/modules/preview/index",
+        "Trace": "../setclient/modules/trace/index",
+        "Project": "./modules/project/index",
+        "Record": "/packageA/public/record/index",
+        "Files": "/packageA/public/files/index"
+    },
+    "navigationBarTitleText": "报价单详情"
+}

+ 15 - 0
packageA/salesForecasting/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;
+    }
+}

+ 21 - 0
packageA/salesForecasting/detail.wxml

@@ -0,0 +1,21 @@
+<view class="header">
+    <view class="title">单号:{{detail.billno}}</view>
+    <Yl-tags id="Tags" add ownertable='sa_salesforecastbill' ownerid='{{sa_salesforecastbillid}}' />
+</view>
+<!-- 简介 -->
+<Yl_Detail list="{{briefs}}">
+    <Yl-group slot='bottom' id='Group' add ownertable='sa_salesforecastbill' ownerid='{{sa_salesforecastbillid}}' />
+</Yl_Detail>
+<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_salesforecastbill' ownerid='{{sa_salesforecastbillid}}' />
+    <Project slot='项目产品清单' id='Project' />
+    <Record slot='操作记录' id="Record" ownertable='sa_salesforecastbill' ownerid='{{sa_salesforecastbillid}}' />
+    <Files slot='附件' id="Files" ownertable='sa_salesforecastbill' ownerid='{{sa_salesforecastbillid}}' />
+    <view style="height: 140rpx;" />
+</Yl_FunTabs>
+
+<!-- 底部 -->
+<Yl_Tabbar list='{{tabbarList}}' bind:callback="tabbarOnClick" />

+ 261 - 0
packageA/salesForecasting/index.js

@@ -0,0 +1,261 @@
+const _Http = getApp().globalData.http,
+    getHeight = require("../../utils/getRheRemainingHeight");
+Page({
+
+    /**
+     * 页面的初始数据
+     */
+    data: {
+        typeList: [{
+            name: '客户报价',
+            index: 0
+        }, {
+            name: '项目报价',
+            index: 1
+        }],
+        typeShow: false,
+        navList: [{
+            label: "全部",
+            icon: "icon-webxialaxuanxiangjiantou",
+            color: "",
+            width: "",
+            id: "1"
+        }, {
+            label: "排序",
+            icon: "icon-shengxu",
+            color: "",
+            width: "",
+            id: "sort"
+        }, {
+            label: "筛选",
+            icon: "icon-shaixuan",
+            color: "",
+            width: "",
+            id: "2"
+        }],
+        classShow: false,
+        classActions: [{
+                name: '全部',
+                index: 0
+            }, {
+                name: '我负责的',
+                index: 1
+            },
+            {
+                name: '我参与的',
+                index: 2
+            },
+            {
+                name: "我下属负责的",
+                index: 3
+            }, {
+                name: "我下属参与的",
+                index: 4
+            }
+        ],
+        content: {
+            "nocache": true,
+            "type": 0,
+            "version": 1,
+            "pageNumber": 1,
+            "pageSize": 20,
+            "where": {
+                "condition": "",
+                "startdate": "",
+                "enddate": "",
+                "status": "",
+            },
+            "sort": []
+        },
+        filter: {
+            show: false,
+            type: ['客户报价', '项目报价'], //状态项
+            typeActive: "",
+            status: ['新建', '提交', '审核'], //状态项
+            statusActive: "",
+            startdate: "",
+            enddate: ""
+        }
+    },
+    onLoad(options) {
+        this.getList();
+    },
+    /* 获取列表 */
+    getList(init = false, data) {
+        if (init.detail != undefined) init = init.detail;
+        let content = this.data.content;
+        if (init) content.pageNumber = 1;
+        if (content.pageNumber > content.pageTotal) return;
+        if (data) {
+            content.where.status = data.statusActive;
+            content.where.startdate = data.startdate;
+            content.where.enddate = data.enddate;
+        }
+        _Http.basic({
+            "id": 20220908134403,
+            content
+        }).then(res => {
+            console.log("预测列表", res)
+            this.selectComponent('#ListBox').RefreshToComplete();
+            if (res.msg != '成功') return wx.showToast({
+                title: res.data,
+                icon: "none"
+            })
+            this.setData({
+                '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();
+        })
+    },
+    /* 处理搜索 */
+    onSearch({
+        detail
+    }) {
+        this.setData({
+            "content.where.condition": detail
+        });
+        this.getList(true);
+    },
+    /* 获取列表标签 */
+    getTags() {
+        let list = this.data.list,
+            ownerids = list.map(v => v.sa_salesforecastbillid);
+
+        _Http.basic({
+            "id": 20221018102001,
+            "content": {
+                nocache: true,
+                "ownertable": "sa_salesforecastbill",
+                ownerids
+            }
+        }).then(res => {
+            console.log("标签", res)
+            for (let key in res.data) {
+                let index = list.findIndex(v => v.sa_salesforecastbillid == key);
+                list[index].tags = res.data[key]
+            };
+            this.setData({
+                list
+            })
+        })
+    },
+    /* 去添加 */
+    openType() {
+        this.setData({
+            typeShow: true
+        })
+    },
+    typeCancel() {
+        this.setData({
+            typeShow: false
+        })
+    },
+    /* 选择添加报价形式 */
+    typeSelect({
+        detail
+    }) {
+        wx.navigateTo({
+            url: detail.name == '项目报价' ? '/packageA/offers/addProjectOffer' : '/packageA/offers/addSetclientOffer',
+        });
+        this.typeCancel();
+    },
+    onReady() {
+        this.setListHeight();
+    },
+    setListHeight() {
+        getHeight.getHeight('.total', this).then(res => {
+            if (this.data.listHeight != res)
+                this.setData({
+                    listHeight: res
+                })
+        });
+    },
+    /* 顶部条件导航回调 */
+    navClick({
+        detail
+    }) {
+        switch (detail.id) {
+            case '1':
+                this.setData({
+                    classShow: true
+                })
+                break;
+            case '2':
+                this.setData({
+                    'filter.show': 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)
+    },
+    /* 筛选状态选择 */
+    selectStatus(e) {
+        const {
+            item
+        } = e.currentTarget.dataset;
+        this.setData({
+            "filter.statusActive": this.data.filter.statusActive == item ? "" : item
+        })
+    },
+    /* 筛选状态选择 */
+    typeStatus(e) {
+        const {
+            item
+        } = e.currentTarget.dataset;
+        this.setData({
+            "filter.typeActive": this.data.filter.typeActive == item ? "" : item
+        })
+    },
+    /* 处理筛选 */
+    handleFilter({
+        detail
+    }) {
+        const data = this.data.filter;
+        if (data.typeActive) data.typeActive = data.typeActive == '客户报价' ? 0 : 1;
+        switch (detail) {
+            case 'confirm':
+                this.setData({
+                    'filter.show': false
+                });
+                this.getList(true, data);
+                break;
+            case 'reset':
+                this.setData({
+                    'filter.statusActive': "",
+                    'filter.typeActive': "",
+                    'filter.startdate': "",
+                    'filter.enddate': "",
+                });
+                this.getList(true, this.data.filter)
+                break;
+            case 'close':
+                this.setData({
+                    'filter.show': false
+                });
+                break;
+        }
+    },
+    onShareAppMessage() {
+
+    }
+})

+ 6 - 0
packageA/salesForecasting/index.json

@@ -0,0 +1,6 @@
+{
+    "usingComponents": {
+        "List": "./modules/list/index"
+    },
+    "navigationBarTitleText": "销售预测"
+}

+ 16 - 0
packageA/salesForecasting/index.scss

@@ -0,0 +1,16 @@
+@import "../../components/Yl_filtrate/groud.scss";
+
+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;
+}

+ 45 - 0
packageA/salesForecasting/index.wxml

@@ -0,0 +1,45 @@
+<Yl_nav search list='{{navList}}' sort='{{content.sort}}' bind:onClick='navClick' bindonSearch="onSearch" />
+<!-- 显示类型 -->
+<van-action-sheet show="{{ classShow }}" actions="{{ classActions }}" cancel-text="取消" bind:cancel="classClose" bind:select="classSelect" />
+<view class="total">共{{content.total}}个</view>
+<My_listBox id='ListBox' height="{{listHeight}}" bind:getlist='getList'>
+    <List list='{{list}}' />
+    <view style="height: 80rpx;" />
+</My_listBox>
+<!-- 筛选条件 -->
+<Yl_filtrate show="{{filter.show}}" bind:handle="handleFilter">
+    <view class="groud">
+        <view class="label">
+            预测类型
+        </view>
+        <view class="content">
+            <van-button custom-class='but {{filter.typeActive==item?"active":""}}' wx:for="{{filter.type}}" wx:key="item" bindtap="typeStatus" data-item="{{item}}">{{item}}</van-button>
+        </view>
+    </view>
+    <view class="groud">
+        <view class="label">
+            预测状态
+        </view>
+        <view class="content">
+            <van-button custom-class='but {{filter.statusActive==item?"active":""}}' wx:for="{{filter.status}}" wx:key="item" bindtap="selectStatus" data-item="{{item}}">{{item}}</van-button>
+        </view>
+    </view>
+    <view class="groud">
+        <view class="label">
+            时间范围
+        </view>
+        <view class="content time">
+            <picker mode="date" bindchange='changeDate' data-name="startdate">
+                <view class="tbox">{{filter.startdate||'开始时间'}}</view>
+            </picker>
+            <view class="partition">-</view>
+            <picker mode="date" bindchange='changeDate' data-name="enddate">
+                <view class="tbox">{{filter.enddate||"结束时间"}}</view>
+            </picker>
+        </view>
+    </view>
+</Yl_filtrate>
+
+<!-- 浮动按钮 -->
+<Yl_FloatingButton bindtap="openType" />
+<van-action-sheet show="{{ typeShow }}" actions="{{ typeList }}" cancel-text="取消" bind:cancel='typeCancel' bind:select='typeSelect' />

+ 11 - 0
packageA/salesForecasting/modules/list/index.js

@@ -0,0 +1,11 @@
+Component({
+    properties: {
+        list: Array
+    },
+    data: {
+
+    },
+    methods: {
+
+    }
+})

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

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

+ 65 - 0
packageA/salesForecasting/modules/list/index.scss

@@ -0,0 +1,65 @@
+.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;
+
+    .tag-box {
+        margin-top: 10rpx;
+
+        .tag {
+            height: 40rpx;
+            font-size: 20rpx;
+            font-family: PingFang SC-Regular, PingFang SC;
+            padding: 0 12rpx;
+            margin-right: 8rpx;
+        }
+    }
+
+    .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;
+        }
+    }
+
+    .exp {
+        height: 34rpx;
+        font-size: 24rpx;
+        color: #666;
+        margin-top: 8rpx;
+
+        text {
+            color: #333333;
+        }
+    }
+}
+
+.line-1 {
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+}

+ 30 - 0
packageA/salesForecasting/modules/list/index.wxml

@@ -0,0 +1,30 @@
+<My_empty wx:if="{{list.length==0}}" />
+<navigator class="offer-list" url="/packageA/salesForecasting/detail?sa_salesforecastbillid={{item.sa_salesforecastbillid}}" wx:for="{{list}}" wx:key="item.billnum">
+    <view class="title">
+        <text class="line-1">{{item.title}}</text>
+        <view class="status" style="background-color: {{backColor.getColor(item.status)}};">{{item.status}}</view>
+    </view>
+    <view class="tag-box">
+        <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 line-1">单号:{{item.billnum}}</view>
+    <view class="exp line-1">提报开始时间:<text>{{item.periodend}}</text></view>
+    <view class="exp line-1">提报周期:<text>{{item.periodpoint}}</text></view>
+    <view class="exp line-1">提报要求:<text>{{item.remarks}}</text></view>
+    <view class="exp line-1">预测金额:<text>{{item.billdate}}</text></view>
+</navigator>
+
+<wxs module="backColor">
+    module.exports.getColor = function (status) {
+        var color = null;
+        if (status == '待提报') {
+            color = '#3874F6';
+        } else if (status == '提报中') {
+            color = '#52C41A';
+        } else {
+            color = '#BBBBBB';
+        };
+        return color
+    }
+</wxs>

+ 92 - 0
packageA/salesForecasting/modules/project/index.js

@@ -0,0 +1,92 @@
+const _Http = getApp().globalData.http;
+Component({
+    data: {
+        sa_salesforecastbillid: 0,
+        "content": {
+            nocache: true,
+            pageSize: 999,
+            total: null,
+            "where": {
+                "condition": ""
+            }
+        },
+        param: {
+            /* id: 20221208105403,
+            version: 1,
+            content: {
+                sa_projectid: 0,
+                pageSize: 20,
+                pageNumber: 1,
+                pageTotal: 1
+            } */
+            "id": 20220906154703,
+            "version": 1,
+            "content": {
+                "sa_salesforecastbillid": 11,
+                "where": {
+                    "condition": "",
+                    "sa_projectid": "1"
+                }
+            }
+        },
+        productList: [], //产品列表
+    },
+    methods: {
+        /* 获取产品列表 */
+        getList(id) {
+            let content = this.data.content;
+            content.sa_salesforecastbillid = id;
+            _Http.basic({
+                "id": "20220916115203",
+                "version": 1,
+                content
+            }).then(res => {
+                console.log("项目清单", res)
+                if (res.msg != '成功') return wx.showToast({
+                    title: res.data,
+                    icon: "none"
+                })
+                this.setData({
+                    list: res.pageNumber == 1 ? res.data : this.data.list.concat(res.data),
+                    "content.pageNumber": res.pageNumber + 1,
+                    "content.pageSize": res.pageSize,
+                    "content.pageTotal": res.pageTotal,
+                    "content.total": res.total,
+                    sa_salesforecastbillid: id
+                });
+                if (res.data.length) {
+                    this.setData({
+                        'param.content.where.sa_projectid': res.data[0].sa_projectid,
+                        'param.content.sa_salesforecastbillid': id,
+                    })
+                    this.getProduct();
+                }
+            })
+        },
+        /* 获取产品清单 */
+        getProduct(init = false) {
+            let param = this.data.param;
+            if (init) param.content.pageNumber = 1;
+            if (param.content.pageNumber > param.content.pageTotal) return;
+            _Http.basic(param).then(res => {
+                console.log("产品列表", res)
+                if (res.msg != '成功') return wx.showToast({
+                    title: res.msg,
+                    icon: "none"
+                });
+                this.setData({
+                    productList: res.pageNumber == 1 ? res.data : this.data.productList.concat(res.data),
+                    "param.content.pageNumber": res.pageNumber + 1,
+                    "param.content.pageTotal": res.pageTotal,
+                })
+            })
+        },
+        /* 切换tab */
+        onChange(e) {
+            this.setData({
+                sa_projectid: e.detail.name
+            });
+            this.getProduct(true);
+        }
+    }
+})

+ 8 - 0
packageA/salesForecasting/modules/project/index.json

@@ -0,0 +1,8 @@
+{
+    "component": true,
+    "usingComponents": {
+        "van-tab": "@vant/weapp/tab/index",
+        "van-tabs": "@vant/weapp/tabs/index",
+        "List": "./list/index"
+    }
+}

+ 10 - 0
packageA/salesForecasting/modules/project/index.scss

@@ -0,0 +1,10 @@
+@import "../../../setclient/modules/address/head.scss";
+
+.count{
+    font-size: 30rpx !important;
+}
+
+.tabs {
+    background-color: #F4F5F7 !important;
+    background: #F4F5F7 !important;
+}

+ 12 - 0
packageA/salesForecasting/modules/project/index.wxml

@@ -0,0 +1,12 @@
+<van-tabs active="{{param.content.sa_projectid}}" wx:if="{{list.length>1}}" nav-class='tabs' color='#3874F6' title-active-color='#3874F6' bind:change='onChange'>
+    <van-tab title="{{item.projectname}}" wx:for="{{list}}" wx:key="index" name='{{item.sa_projectid}}' />
+</van-tabs>
+<view class="head">
+    <view class="count"><text wx:if="{{list.length==1}}" style="margin-right: 15rpx;">{{list[0].projectname}}</text>金额:<text style="color: #FF3B30;">¥99999999</text></view>
+    <view class="expand">
+        <navigator url="#" class="but" bindtap="addProduct">
+            <van-icon name="plus" />
+        </navigator>
+    </view>
+</view>
+<List list='{{productList}}' />

+ 11 - 0
packageA/salesForecasting/modules/project/list/index.js

@@ -0,0 +1,11 @@
+Component({
+    properties: {
+        list: Array
+    },
+    data: {
+
+    },
+    methods: {
+
+    }
+})

+ 4 - 0
packageA/salesForecasting/modules/project/list/index.json

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

+ 0 - 0
packageA/salesForecasting/modules/project/list/index.scss


+ 3 - 0
packageA/salesForecasting/modules/project/list/index.wxml

@@ -0,0 +1,3 @@
+<view wx:for="{{list}}">
+    {{index}}
+</view>