xiaohaizhao 11 месяцев назад
Родитель
Сommit
105f8736cc

+ 2 - 1
app.json

@@ -195,7 +195,8 @@
                 "customerBlance/Pipeline",
                 "dataOverview/index",
                 "dataOverview/OverviewAndDetails/Clue",
-                "FinancialCollectionAnalysis/detail"
+                "FinancialCollectionAnalysis/detail",
+                "AnalysisOfUninvoicedShipments/detail"
             ]
         }
     ],

+ 83 - 0
salesPanel/AnalysisOfUninvoicedShipments/detail.js

@@ -0,0 +1,83 @@
+const _Http = getApp().globalData.http,
+    currency = require("../../utils/currency"),
+    CNY = (value, symbol = "¥", precision = 2) => currency(value, {
+        symbol,
+        precision
+    }).format();
+Page({
+    data: {
+        id: "20231024201604",
+        searchShow: false,
+        searchValue: "",
+    },
+    onLoad(options) {
+        getApp().globalData.Language.getLanguagePackage('订单未回款明细')
+        this.setData({
+            content: JSON.parse(options.content),
+            siteid: wx.getStorageSync('userMsg').siteid
+        })
+        this.getList()
+    },
+    changeSearchShow() {
+        this.setData({
+            searchShow: !this.data.searchShow
+        })
+        this.selectComponent('#ListBox').automaticSetHei();
+    },
+    getList(init = false) {
+        _Http.init(this.data.content, init).then(content => {
+            _Http.basic({
+                "id": this.data.id,
+                content
+            }).then(res => {
+                console.log( "明细列表", res)
+                this.selectComponent('#ListBox').automaticSetHei();
+                this.selectComponent('#ListBox').RefreshToComplete();
+                if (res.code != '1') return wx.showToast({
+                    title: res.data,
+                    icon: "none"
+                })
+                res.data = res.data.map(v => {
+                    v.price = CNY(v.price)
+                    v.amount = CNY(v.amount)
+                    v.outOrderamount = CNY(v.outOrderamount)
+                    v.invoiceamount = CNY(v.invoiceamount)
+                    v.unwriteoffamount = CNY(v.unwriteoffamount)
+                    v.expanded = false;
+                    return v
+                })
+                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,
+                    "total": res.total,
+                })
+            })
+        })
+    },
+    changeExpanded(e) {
+        const {
+            index
+        } = e.currentTarget.dataset;
+        this.setData({
+            [`list[${index}].expanded`]: !this.data.list[index].expanded
+        })
+    },
+    onSearch() {
+        this.data.content.where.condition = this.data.searchValue;
+        this.getList(true);
+    },
+    onChange(event) {
+        this.setData({
+            searchValue: event.detail
+        })
+    },
+    onClear() {
+        this.setData({
+            searchValue: "",
+            "content.where.condition": ""
+        })
+        this.getList(true);
+    }
+})

+ 4 - 0
salesPanel/AnalysisOfUninvoicedShipments/detail.json

@@ -0,0 +1,4 @@
+{
+    "usingComponents": {},
+    "navigationBarTitleText": "订单未回款明细"
+}

+ 1 - 0
salesPanel/AnalysisOfUninvoicedShipments/detail.scss

@@ -0,0 +1 @@
+@import "../panel/detail.scss";

+ 76 - 0
salesPanel/AnalysisOfUninvoicedShipments/detail.wxml

@@ -0,0 +1,76 @@
+<view class='tab-box'>
+	<view class="left">
+		<view class="user line-1">{{language[content.enterprisename]||content.enterprisename}}</view>
+	</view>
+	<view class="right">
+		<view class="search-box" hover-class="navigator-hover" bindtap="changeSearchShow">
+			<text class="iconfont icon-a-sousuolansousuo" />
+		</view>
+	</view>
+</view>
+<view wx-if="{{searchShow}}">
+	<van-transition show="{{ searchShow }}" name='fade' duration='300'>
+		<view>
+			<van-search focus="{{focus}}" value="{{searchValue}}" placeholder="{{language['请输入关键字']||'请输入关键字'}}" bind:search="onSearch" bind:clear="onClear" bind:change="onChange" />
+		</view>
+	</van-transition>
+</view>
+<view class="global-total">
+	<text wx:if="{{language['总共']}}">{{language['总共']}}:{{content.total}}</text>
+	<text wx:else>总共{{total}}个</text>
+</view>
+<Yl_ListBox id='ListBox' bind:getlist='getList'>
+	<view class="global-card" wx:for="{{list}}" wx:key="sa_orderitemsid">
+		<view class="title">
+			{{item.sonum}}
+		</view>
+		<view class="row" wx:if="{{item.expanded}}">erp{{language['订单号']||'订单号'}}:{{item.erpbillno ||' --'}}</view>
+		<view class="row">{{language['业务员']||'业务员'}}:{{item.name ||' --'}}</view>
+		<view class="row" wx:if="{{item.expanded}}">{{language['部门']||'部门'}}:{{item.depname ||' --'}}</view>
+		<view class="row">{{language['客户名称']||'客户名称'}}:{{item.enterprisename ||' --'}}</view>
+		<view class="row" wx:if="{{item.expanded}}">{{language['客户']||'客户'}}erp{{language['编号']||'编号'}}:{{item.agentnum ||' --'}}</view>
+		<view class="row">{{language['订单行号']||'订单行号'}}:{{item.rowno ||' --'}}</view>
+		<view class="row">{{language['产品名称']||'产品名称'}}:{{item.itemname ||' --'}}</view>
+		<view class="row">{{language['品号']||'品号'}}:{{item.itemno ||' --'}}</view>
+		<block wx:if="{{item.expanded}}">
+			<view class="row">
+				{{language['型号']||'型号'}}:{{language[item.model]||item.model||' --'}}
+			</view>
+			<view class="row" wx:if="{{siteid!='HY'}}">
+				{{language['规格']||'规格'}}:{{language[item.spec]||item.spec||' --'}}
+			</view>
+			<view class="row" wx:if="{{siteid=='HY'}}">
+				{{language['公称通径']||'公称通径'}}:{{item.caliber||' --'}}
+			</view>
+			<view class="row" wx:if="{{siteid=='HY'}}">
+				{{language['公称压力']||'公称压力'}}:{{item.nominalpressureStr||' --'}}
+			</view>
+			<view class="row">
+				{{language['订单数量']||'订单数量'}}:{{item.qty||0}}
+			</view>
+			<view class="row">
+				{{language['计量单位']||'计量单位'}}:{{language[item.unit]||item.unit||' --'}}
+			</view>
+			<view class="row">
+				{{language['折后价格']||'折后价格'}}:{{item.price}}
+			</view>
+		</block>
+		<view class="row">
+			{{language['折后金额']||'折后金额'}}:{{item.amount}}
+		</view>
+		<view class="row">
+			{{language['出货金额']||'出货金额'}}:{{item.outOrderamount}}
+		</view>
+		<view class="row" wx:if="{{item.expanded}}">
+			{{language['出货日期']||'出货日期'}}:{{item.outOrderdate}}
+		</view>
+		<view class="row">
+			{{language['开票未核销金额']||'开票未核销金额'}}:{{item.unwriteoffamount}}
+		</view>
+		<view class="{{item.expanded?'expanded up':'expanded'}}" data-index="{{index}}" bind:tap="changeExpanded">
+			{{item.expanded?'简略信息':'详情信息'}}
+			<text class="iconfont icon-dianjizhankai" />
+		</view>
+	</view>
+	<My_empty wx:if="{{list.length==0}}" />
+</Yl_ListBox>

+ 147 - 0
salesPanel/AnalysisOfUninvoicedShipments/index.js

@@ -0,0 +1,147 @@
+const _Http = getApp().globalData.http,
+    currency = require("../../utils/currency"),
+    CNY = (value, symbol = "¥", precision = 2) => currency(value, {
+        symbol,
+        precision
+    }).format();
+
+import * as echarts from '../ec-canvas/echarts';
+Component({
+    properties: {
+
+    },
+    options: {
+        addGlobalClass: true
+    },
+    lifetimes: {
+        attached: function () {
+            getApp().globalData.Language.getLanguagePackage(this)
+        }
+    },
+    data: {
+        "content": {
+            dataid: wx.getStorageSync('userMsg').userid,
+            username: wx.getStorageSync('userMsg').name,
+            unwriteoffamounttype: "订单",
+            where: {}
+        },
+        pages: {
+            pageNumber: 1,
+            pageTotal: 1,
+            pageSize: 20
+        },
+        list: []
+    },
+    methods: {
+        async getList(init = false) {
+            if (init.detail != undefined) init = init.detail;
+            let content = this.data.content,
+                pages = this.data.pages;
+            const {
+                dataid,
+                type,
+                username,
+                isleave
+            } = getCurrentPages()[getCurrentPages().length - 1].data;
+            if (content.dataid != dataid || content.type != type || isleave != isleave) init = true
+            content.dataid = dataid;
+            content.type = type;
+            content.username = username;
+            content.where.isleave = isleave;
+            if (init) {
+                pages.pageNumber = 1;
+                pages.pageTotal = 1;
+            }
+            if (pages.pageNumber <= pages.pageTotal) _Http.basic({
+                "id": 20231016163904,
+                content: Object.assign(content, pages)
+            }).then(res => {
+                console.log("出货未开票分析", res)
+                this.selectComponent('#ListBox').RefreshToComplete();
+                if (res.code != '1') return wx.showToast({
+                    title: res.data,
+                    icon: "none"
+                })
+                res.data = res.data.map(v => {
+                    v.zerotothree = CNY(v.zerotothree)
+                    v.threetosix = CNY(v.threetosix)
+                    v.sixtotwelve = CNY(v.sixtotwelve)
+                    v.twelveup = CNY(v.twelveup)
+                    v.total = CNY(v.total)
+                    return v
+                })
+                pages.pageNumber++;
+                pages.pageTotal = res.pageTotal;
+                this.setData({
+                    list: res.pageNumber == 1 ? res.data : this.data.list.concat(res.data),
+                    pages
+                })
+                if (init) this.initChart(res.data[0].Trend)
+            })
+        },
+        toDetail(e) {
+            let content = this.data.content;
+            content.sys_enterpriseid = e.currentTarget.dataset.item.sys_enterpriseid;
+            content.enterprisename = e.currentTarget.dataset.item.enterprisename;
+            wx.navigateTo({
+                url: '/salesPanel/AnalysisOfUninvoicedShipments/detail?content=' + JSON.stringify(content)
+            })
+        },
+        initChart(data) {
+            console.log("data", data)
+            let dividend = wx.getStorageSync('languagecode') == 'ZH' ? 10000 : 1000;
+            let series = data.map(item => ({
+                name: getApp().globalData.Language.getMapText(item.key),
+                type: 'bar',
+                stack: 'total',
+                label: {
+                    show: true
+                },
+                emphasis: {
+                    focus: 'series'
+                },
+                itemStyle: {
+                    color: "#5F9DFC"
+                },
+                data: (item.value / dividend).toFixed(2)
+            }));
+            console.log("series", series)
+            let option = {
+                legend: {
+                    data: [getApp().globalData.Language.getMapText('出货未开票金额') + '(' + getApp().globalData.Language.getMapText('万元') + ')']
+                },
+                grid: {
+                    left: '3%',
+                    right: '4%',
+                    bottom: '3%',
+                    containLabel: true
+                },
+                xAxis: {
+                    type: 'value'
+                },
+                yAxis: {
+                    type: 'category',
+                    data: data.map(v => getApp().globalData.Language.getMapText(v.key))
+                },
+                series
+            };
+            this.chartComponent = this.selectComponent('#mychart');
+            this.chartComponent.init((canvas, width, height, dpr) => {
+                const chart = echarts.init(canvas, null, {
+                    width,
+                    height,
+                    devicePixelRatio: dpr
+                });
+                chart.setOption(option);
+                return chart;
+            });
+        },
+    
+        showExplain(e) {
+            const {
+                name
+            } = e.currentTarget.dataset;
+            getApp().globalData.Language.modeBoxPrompts(getApp().globalData.Language.getMapText('统计到当前查询时间为止的') + name + "(" + getApp().globalData.Language.getMapText('审核状态') + ")")
+        },
+    }
+})

+ 6 - 0
salesPanel/AnalysisOfUninvoicedShipments/index.json

@@ -0,0 +1,6 @@
+{
+    "component": true,
+    "usingComponents": {
+        "ec-canvas": "../ec-canvas/ec-canvas"
+    }
+}

+ 20 - 0
salesPanel/AnalysisOfUninvoicedShipments/index.scss

@@ -0,0 +1,20 @@
+@import "../customerBlance/index.scss";
+@import "../analysisOfOrderTypeDistribution/index.scss";
+
+.chart {
+	height: 630rpx;
+	width: 100vw;
+}
+
+.chart2 {
+	position: relative;
+
+	ec-canvas {
+		position: absolute;
+		top: -670rpx;
+		width: 700rpx;
+		height: 630rpx;
+		z-index: 2;
+		right: 20rpx;
+	}
+}

+ 29 - 0
salesPanel/AnalysisOfUninvoicedShipments/index.wxml

@@ -0,0 +1,29 @@
+<Yl_ListBox id='ListBox' bind:getlist='getList'>
+	<view class="global-card">
+		<view class="chart"></view>
+	</view>
+
+	<view class="chart2">
+		<ec-canvas id="mychart" canvas-id="chart" ec="{{ ec }}"></ec-canvas>
+	</view>
+	<My_empty wx:if='{{!list.length}}' />
+	<block wx:else>
+		<view hover-class="navigator-hover" url="#" class="global-card item" wx:for="{{list}}" wx:key="sys_enterpriseid" data-item="{{item}}" bind:tap="toDetail">
+			<view class="title">
+				{{item.enterprisename}}
+			</view>
+			<view class="row">erp{{language['编号']||'编号'}}:{{item.erpagentnum ||' --'}}</view>
+			<view class="row">{{language['业务员']||'业务员'}}:{{item.name ||' --'}}</view>
+			<view class="row">{{language['部门']||'部门'}}:{{item.depname ||' --'}}</view>
+			<view class="row">{{language['0~3月未回款金额']||'0~3月未回款金额'}}:{{item.zerotothree ||' --'}}</view>
+			<view class="row">{{language['3~6月未回款金额']||'3~6月未回款金额'}}:{{item.threetosix ||' --'}}</view>
+			<view class="row">{{language['6~12月未回款金额']||'6~12月未回款金额'}}:{{item.sixtotwelve ||' --'}}</view>
+			<view class="row">{{language['一年以上未回款金额']||'一年以上未回款金额'}}:{{item.twelveup ||' --'}}</view>
+			<view class="row">{{language['未回款总金额']||'未回款总金额'}}:{{item.total ||' --'}}</view>
+			<view class="but">
+				{{language['明细']||'明细'}}
+				<text class='iconfont icon-webfanhui' />
+			</view>
+		</view>
+	</block>
+</Yl_ListBox>

+ 3 - 2
salesPanel/index/index.js

@@ -51,12 +51,13 @@ Page({
             label: "已下单未出货分析",
             model: "#ShipmentAnalysis1"
         }, {
-            label: "出货未开票分析"
+            label: "出货未开票分析",
+            model: "#AnalysisOfUninvoicedShipments"
         }, {
             label: "财务回款分析",
             model: "#FinancialCollectionAnalysis"
         }],
-        tabsActive: 14,
+        tabsActive: 13,
         showFiltrate: false,
         dataid: wx.getStorageSync('userMsg').userid,
         username: wx.getStorageSync('userMsg').name,

+ 1 - 0
salesPanel/index/index.json

@@ -6,6 +6,7 @@
         "TrendAnalysis": "../trendAnalysis/index",
         "GoodsDispatchedButInvoiceNotIssued": "../GoodsDispatchedButInvoiceNotIssued/index",
         "FinancialCollectionAnalysis": "../FinancialCollectionAnalysis/index",
+        "AnalysisOfUninvoicedShipments": "../AnalysisOfUninvoicedShipments/index",
         "ShipmentAnalysis": "../shipmentAnalysis/index",
         "analysisOfOrderTypeDistribution": "../analysisOfOrderTypeDistribution/index",
         "AnalysisOfTheProportionOfProductCategoriesInOrders": "../AnalysisOfTheProportionOfProductCategoriesInOrders/index",

+ 1 - 0
salesPanel/index/index.wxml

@@ -28,6 +28,7 @@
     <AnalysisOfTheProportionOfProductCategoriesInOrders slot="订单产品类别占比分析" id="AnalysisOfTheProportionOfProductCategoriesInOrders" />
     <GoodsDispatchedButInvoiceNotIssued slot="近12月出货未开票金额趋势分析" id="GoodsDispatchedButInvoiceNotIssued" />
     <FinancialCollectionAnalysis slot="财务回款分析" id="FinancialCollectionAnalysis" />
+    <AnalysisOfUninvoicedShipments slot="出货未开票分析" id="AnalysisOfUninvoicedShipments" />
     <top10 slot="销售TOP10" id="Top10" />
 </Yl_FunTabs>
 <Yl_Filtrate1 id="Yl_Filtrate1" show='{{showFiltrate}}' list="{{[]}}" bindhandle="handleFilter">