una před 4 roky
rodič
revize
2f3b5dff34

+ 3 - 1
client/app.json

@@ -22,7 +22,9 @@
     "pages/customer/servantsettings/servantsettings",
    "pages/customer/servantedit/servantedit",
     "pages/customer/reportList/reportList",
-    "pages/customer/editDailyTask/editDailyTask"
+    "pages/customer/editDailyTask/editDailyTask",
+    "pages/servant/monthReport/monthReport",
+    "pages/servant/reportList/reportList"
   ],
   "window": {
     "defaultTitle": "保姆管家",

+ 3 - 1
client/pages/customer/servantedit/servantedit.json

@@ -1 +1,3 @@
-{}
+{
+  "defaultTitle": "编辑服务标准"
+}

+ 3 - 3
client/pages/customer/servantsettings/servantsettings.axml

@@ -1,9 +1,9 @@
 <view class="servant-settings-page">
 <!--服务设置-->
-  <view class="servant-setting-header">
+  <view class="servant-setting-header"  a:if="{{tips}}">
     <image mode="scaleToFill" src="/image/notice-blue.png" class="notice-style"/>
-    <text>您可以查看保姆偏好,双向沟通更清晰</text>
-    <image mode="scaleToFill" src="/image/close-blue.png" class="close-stle"/>
+    <text  onTap="toservantdetail">您可以查看保姆偏好,双向沟通更清晰</text>
+    <image mode="scaleToFill" src="/image/close-blue.png" class="close-stle" onTap="closeTip"/>
   </view>
   <!--服务列表-->
   <view class="setting-list" a:for="{{servantlist}}" key="{{index}}">

+ 11 - 1
client/pages/customer/servantsettings/servantsettings.js

@@ -7,6 +7,7 @@ var app = getApp();
 
 Page({
   data: {
+     tips:true,
     servantlist:[],
   },
   onLoad() {
@@ -169,7 +170,16 @@ Page({
       servantlist: servantlist
     })
   },
-  
+  closeTip(){
+    this.setData({
+      tips: false
+    })
+  },
+    toservantdetail(){
+    my.navigateTo({
+      url: '../servantdetail/servantdetail'
+    });
+  },
   //切换tab
   loadclasslist(e){
     let nowsubtypeNo=e.target.dataset.id;

+ 76 - 0
client/pages/servant/monthReport/monthReport.acss

@@ -0,0 +1,76 @@
+.f2-chart {
+  width: 100%;
+  height: 500rpx;
+}
+.report-wrapper{
+  font-size: 0;
+  background: #5C4CEA;
+  padding:0  0 10rpx;
+}
+.report-img{
+  width:100%;
+}
+.block-data-wrapper{
+  position: relative;
+  font-size: 30rpx;
+}
+.common-data{
+  position:absolute;
+  top:0;
+  left:0;
+  right:0;
+  bottom:0;
+  z-index:100;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  color:#5C4CEA;
+  flex-direction: column;
+}
+.report-date{
+  margin:36rpx 0;
+  font-size: 90rpx;
+  font-weight:bold;
+}
+.service-day{
+  margin:0 0 36rpx 0;
+}
+.service-day text{
+  font-size:48rpx;
+  color:#E95E4A;
+  font-weight: bolder;
+}
+.percent-top text{
+  color:#E95E4A;
+  font-weight: bolder;
+}
+
+.expend-total{
+  height: 90rpx;
+  line-height: 90rpx;
+  margin:30rpx 44rpx 20rpx; ;
+  border-radius: 20rpx;
+  font-size: 36rpx;
+  color: white;
+  text-align: center;
+  border:3rpx solid #fff;
+}
+.expend-total text{
+  color: #EFC149;
+}
+.shape-chart1{
+  padding:100rpx 40rpx 40rpx;
+}
+.shape-chart2{
+  padding:260rpx 40rpx 40rpx;
+}
+.shape-chart5{
+  padding:80rpx 40rpx 80rpx;
+}
+.no-chart-tip{
+  color: #fff;
+  font-size: 28rpx;
+  line-height: 60rpx;
+  text-align: center;
+  padding:60rpx 40rpx 120rpx ;
+}

+ 66 - 0
client/pages/servant/monthReport/monthReport.axml

@@ -0,0 +1,66 @@
+<view class="report-wrapper">
+     <!--<view class="f2-chart"><f2 onInit="onInitChart"></f2></view><view class="f2-chart"><f2 onInit="onInitChart2"></f2></view> -->
+     <image mode="widthFix" class="report-img" src="/image/report-01.jpg"/>
+     <view class="common-data-wrapper block-data-wrapper">
+          <image mode="widthFix" class="report-img" src="/image/report-02.jpg"/>
+          <view class="common-data">
+               <view>——保姆服务月度回顾——</view>
+               <view class="report-date">{{reportDate}}</view>
+               <view class="service-day">您已服务[{{servantName}}]
+                    <text>{{serviceDay}}</text>天啦!</view>
+               <view class="percent-top">超过全国
+                    <text>{{percentTop}}</text>的同行</view>
+          </view>
+     </view>
+     <image mode="widthFix" class="report-img" src="/image/report-03.jpg"/>
+     <!-- 本月花销合计 -->
+     <view class="expend-total">
+          您本月服务花销共计
+          <text>{{expendTotal}}</text> 元
+     </view>
+
+     <view class="chart-module-wrapper"  a:if={{chartShow}}>
+         <view class="common-data-wrapper block-data-wrapper">
+          <image mode="widthFix" class="report-img" src="/image/report-04.jpg"/>
+          <view class="common-data shape-chart1">
+               <f2 onInit="onInitChart1"></f2>
+          </view>
+     </view>
+     <view class="common-data-wrapper block-data-wrapper">
+          <image mode="widthFix" class="report-img" src="/image/report-05.jpg"/>
+          <view class="common-data shape-chart2">
+               <f2 onInit="onInitChart2"></f2>
+          </view>
+     </view>
+     <!-- 任务完成趋势图 -->
+     <view class="common-data-wrapper block-data-wrapper">
+          <image mode="widthFix" class="report-img" src="/image/report-06.jpg"/>
+          <view class="common-data shape-chart1">
+               <f2 onInit="onInitChart3"></f2>
+          </view>
+     </view>
+     <!-- 任务完成详细情况 -->
+     <view class="common-data-wrapper block-data-wrapper">
+          <image mode="widthFix" class="report-img" src="/image/report-07.jpg"/>
+          <view class="common-data shape-chart1">
+               <f2 onInit="onInitChart4"></f2>
+          </view>
+     </view>
+     <!-- 任务无法完成原因 -->
+     <view class="common-data-wrapper block-data-wrapper">
+          <image mode="widthFix" class="report-img" src="/image/report-08.png"/>
+          <view class="common-data shape-chart5">
+               <f2 onInit="onInitChart5"></f2>
+          </view>
+     </view>
+     </view>
+     <view class="no-chart-tip" a:if={{!chartShow}}>
+        <view>好可惜,您的雇主本月未设置任务服务,快去让雇主设置吧</view>
+        <view>精彩下次为您呈现~</view>
+     </view>
+     
+     <!--<image mode="widthFix" class="report-img" src="/image/report-04.jpg"/><image mode="widthFix" class="report-img" src="/image/report-05.jpg"/> -->
+     <!--<image mode="widthFix" class="report-img" src="/image/report-06.jpg"/> -->
+     <!--<image mode="widthFix" class="report-img" src="/image/report-07.jpg"/> -->
+     <!--<image mode="widthFix" class="report-img" src="/image/report-08.png"/> -->
+</view>

+ 380 - 0
client/pages/servant/monthReport/monthReport.js

@@ -0,0 +1,380 @@
+
+
+import F2 from '@antv/f2';
+// 建议统一从 lib 下引入
+const PieLabel = require('@antv/f2/lib/plugin/pie-label'); // 引入 PieLabel 模块
+
+// 方式一:全局注册
+F2.Chart.plugins.register(PieLabel);
+import request from '../../../util/http'
+import apiUrl from '../../../util/apiUrl'
+var app = getApp();
+Page({
+  data: {
+    reportDate: '',
+    servantName: '',
+    serviceDay: '',
+    percentTop: '',
+    expendTotal: '',
+    taskNum: '',
+    reportInfo:'',
+    chartShow:true,
+  },
+  onLoad() {
+    let reportInfo=app.globalData.reportInfo;
+    let serviceTime=JSON.parse(reportInfo.serviceTime);
+    let year=(serviceTime.year==null?'':serviceTime.year);
+    let month=(serviceTime.month==null?'':serviceTime.month);
+    console.log(reportInfo);
+      if(reportInfo.attrOne=='3'){
+        this.setData({
+          chartShow:false,
+
+        })
+      }else{
+         this.setData({
+          chartShow:true,
+
+        })
+      }
+    this.setData({
+      reportInfo:reportInfo,
+      reportDate:year+'年'+month+'月',
+      servantName:serviceTime.nickName,
+      serviceDay:serviceTime.serviceDays,
+      percentTop:serviceTime.serviceQuality,
+      expendTotal:reportInfo.expenses
+    })
+  },
+  onInitChart(F2, config) {
+    //  饼状图
+    const chart = new F2.Chart(config);
+    const data = [
+      { name: '打扫房间', proportion: 0.4, a: '1' },
+      { name: '打扫厨房', proportion: 0.2, a: '1' },
+      { name: '带孩子', proportion: 0.18, a: '1' },
+      { name: '照顾老人', proportion: 0.15, a: '1' },
+      { name: '清洁厨房', proportion: 0.05, a: '1' },
+      { name: '其他', proportion: 0.02, a: '1' },
+    ];
+
+    chart.source(data);
+    chart.legend({
+      position: 'right'
+    });
+    chart.coord('polar', {
+      transposed: true,
+      innerRadius: 0.7,
+    });
+    chart.axis(false);
+    chart
+      .interval()
+      .position('a*proportion')
+      .color('name', [
+        '#1890FF',
+        '#13C2C2',
+        '#2FC25B',
+        '#FACC14',
+        '#F04864',
+        '#8543E0',
+      ])
+      .adjust('stack');
+
+    chart.render();
+
+    // 注意:需要把chart return 出来
+    return chart;
+  },
+
+  onInitChart1(F2, config) {
+    //  本月任务分布饼状图
+    const chart = new F2.Chart(config);
+    let taskNum = JSON.parse(this.data.reportInfo.pieChart).taskSum;
+       let dataList=JSON.parse(this.data.reportInfo.pieChart).randList;
+       dataList.forEach(item => {
+          item.percentage=(item.percentage)*1;
+       });
+       const data =dataList;
+
+    // const data = JSON.parse(this.data.reportInfo.pieChart).randList;
+    //  const data=[{"taskName":"洗护类","percentage":0.2},{"taskName":"洗e类","percentage":0.8}]
+
+    chart.source(data);
+    chart.legend(false);
+    chart.coord('polar', {
+      transposed: true,
+      innerRadius: 0.6,
+    });
+    chart.axis(false);
+    chart
+      .interval()
+      .position('1*percentage')
+      .color('taskName', [
+        '#EB6F49',
+        '#00D98B',
+        '#FDB628',
+        '#0091F1',
+        '#00E4EC',
+        '#8256E8',
+      ])
+      .adjust('stack');
+    chart.guide()
+      .text({
+        position: ['50%', '50%'],
+        style: {
+          fill: '#7ED4F6',
+          fontSize: '12',
+        },
+        content: ` 本月共
+  ${taskNum}条任务`,
+
+        limitInPlot: true,
+      });
+    chart.pieLabel({
+      sidePadding: 30,
+      activeShape: true,
+      label1: function label1(data) {
+        return {
+          text: data.taskName,
+          fill: '#7ED4F6',
+          fontWeight: 'bold'
+        };
+      },
+      label2: function label2(data) {
+        return {
+          text: data.percentage+'%',
+          fill: '#7ED4F6'
+        };
+      },
+      onClick: function onClick(ev) {
+        console.log(ev.data);
+
+      }
+    });
+    chart.render();
+
+    // 注意:需要把chart return 出来
+    return chart;
+  },
+  onInitChart2(F2, config) {
+    //  本月任务完成情况
+    const chart = new F2.Chart(config);
+     let dataList=JSON.parse(this.data.reportInfo.finishInfo);
+       dataList.forEach(item => {
+          item.percent=(item.percent)*1;
+          item.const='const';
+       });
+       const data =dataList;
+
+      //  const data=[{"name":"完成","percent":100,"const":'const'},{"name":"无法完成","percent":200,"const":'const'},{"name":"未完成","percent":300,"const":'const'},{"name":"补打卡","percent":400,"const":'const'}]
+    // const data = JSON.parse(this.data.reportInfo.finishInfo);
+
+    chart.source(data);
+    chart.legend(false);
+    chart.coord('polar', {
+      transposed: true,
+    });
+    chart.axis(false);
+    chart
+      .interval()
+      .position('const*percent')
+      .color('name', [
+        '#EB6F49',
+        '#00D98B',
+        '#FDB628',
+        '#0091F1',
+        '#00E4EC',
+        '#8256E8',
+      ])
+      .adjust('stack');
+
+    chart.pieLabel({
+      sidePadding: 30,
+      activeShape: true,
+      label1: function label1(data) {
+        return {
+          text: data.name,
+          fill: '#7ED4F6',
+          fontWeight: 'bold'
+        };
+      },
+      label2: function label2(data) {
+        return {
+          text: data.percent+'%',
+          fill: '#7ED4F6'
+        };
+      },
+      onClick: function onClick(ev) {
+        console.log(ev.data);
+
+      }
+    });
+    chart.render();
+
+    // 注意:需要把chart return 出来
+    return chart;
+  },
+   onInitChart3(F2, config) {
+
+    //任务完成趋势图
+    const chart = new F2.Chart(config);
+ const data = JSON.parse(this.data.reportInfo.taskTrend);
+    chart.source(data, {
+      workDay: {
+    type: 'timeCat',
+    tickCount: 5,
+    // mask: 'hh:mm',
+    range: [ 0, 1 ]
+  },
+  taskNum: {
+    tickCount: 3,
+    // formatter: function formatter(ivalue) {
+    //   return ivalue + '%';
+    // }
+  }
+    });
+    // chart.tooltip({
+    //   showItemMarker: false,
+    //   onShow: function onShow(ev) {
+    //     const items = ev.items;
+    //     items[0].name = null;
+    //     items[0].name = items[0].title;
+    //     items[0].value = '¥ ' + items[0].value;
+    //   }
+    // });
+  chart.axis('workDay', {
+  line: null,
+  label: function label(text, index, total) {
+    const textCfg = {};
+    if (index === 0) {
+      textCfg.textAlign = 'left';
+    } else if (index === total - 1) {
+      textCfg.textAlign = 'right';
+    }
+    return textCfg;
+  }
+});
+chart.axis('tem', {
+  grid: function grid(text) {
+    if (text === '0%') {
+      return {
+        lineDash: null,
+        lineWidth: 1
+      };
+    }
+  }
+});
+chart.legend({
+  position: 'bottom',
+  offsetY: -5
+});
+chart.line()
+  .position('workDay*taskNum')
+  .color('name');
+  
+
+chart.render();
+    // 注意:需要把chart return 出来
+    return chart;
+  },
+  onInitChart4(F2, config) {
+    //  任务类完成详细情况
+    const chart = new F2.Chart(config);
+      let dataList=JSON.parse(this.data.reportInfo.classfInish).lefts;
+       dataList.forEach(item => {
+          item.finishRate=(item.finishRate)*1;
+       });
+       const data =dataList;
+    // const data = [{"taskClass":"洗护类","finishRate":100.00,"type":"1","name":null},{"taskClass":"做饭类","finishRate":66.67,"type":"2","name":null},{"taskClass":"打扫类","finishRate":83.33,"type":"3","name":null},{"taskClass":"照顾老人类","finishRate":100.00,"type":"4","name":null},{"taskClass":"照顾孩子类","finishRate":66.67,"type":"5","name":null}];
+    // const data=JSON.parse(this.data.reportInfo.classfInish).lefts;
+    chart.source(data, {
+      finishRate: {
+    tickCount: 3,
+    range: [ 0, 1 ],
+    formatter: function formatter(ivalue) {
+      return ivalue + '%';
+    }
+  }
+    });
+    // chart.tooltip({
+    //   showItemMarker: false,
+    //   onShow: function onShow(ev) {
+    //     const items = ev.items;
+    //     items[0].name = null;
+    //     items[0].name = items[0].title;
+    //     items[0].value = '¥ ' + items[0].value;
+    //   }
+    // });
+    chart.interval()
+      .position('taskClass*finishRate')
+      .color('l(90) 0:#1890ff 1:#70cdd0'); // 定义柱状图渐变色
+    chart.render();
+    // 注意:需要把chart return 出来
+    return chart;
+  },
+  onInitChart5(F2, config) {
+
+    //任务无法完成原因
+    const chart = new F2.Chart(config);
+    // const data = [{"number":"20","typeName":"任务太多"},{"number":"0","typeName":"我不会"},{"number":"10","typeName":"任务不详细"}];
+    
+     let dataList=JSON.parse(this.data.reportInfo.unfinishd);
+       dataList.forEach(item => {
+          item.number=(item.number)*1;
+       });
+       const data =dataList;
+    // const data=JSON.parse(this.data.reportInfo.unfinishd);
+    chart.source(data, {
+      sales: {
+        tickCount: 5
+      }
+    });
+    // chart.tooltip({
+    //   showItemMarker: false,
+    //   onShow: function onShow(ev) {
+    //     const items = ev.items;
+    //     items[0].name = null;
+    //     items[0].name = items[0].title;
+    //     items[0].value = '¥ ' + items[0].value;
+    //   }
+    // });
+    chart.interval()
+      .position('typeName*number')
+      .color('l(90) 0:#FBEC9F 1:#F3D34D'); // 定义柱状图渐变色
+    chart.render();
+    // 注意:需要把chart return 出来
+    return chart;
+  },
+  onInitChart0(F2, config) {
+
+    //折线图
+    const chart = new F2.Chart(config);
+    const data = [
+      { value: 63.4, city: 'New York', date: '2011-10-01' },
+      { value: 62.7, city: 'Alaska', date: '2011-10-01' },
+      { value: 72.2, city: 'Austin', date: '2011-10-01' },
+      { value: 58, city: 'New York', date: '2011-10-02' },
+      { value: 59.9, city: 'Alaska', date: '2011-10-02' },
+      { value: 67.7, city: 'Austin', date: '2011-10-02' },
+      { value: 53.3, city: 'New York', date: '2011-10-03' },
+      { value: 59.1, city: 'Alaska', date: '2011-10-03' },
+      { value: 69.4, city: 'Austin', date: '2011-10-03' },
+    ];
+    chart.source(data, {
+      date: {
+        range: [0, 1],
+        type: 'timeCat',
+        mask: 'MM-DD'
+      },
+      value: {
+        max: 300,
+        tickCount: 4
+      }
+    });
+    chart.area().position('date*value').color('city').adjust('stack');
+    chart.line().position('date*value').color('city').adjust('stack');
+    chart.render();
+    // 注意:需要把chart return 出来
+    return chart;
+  },
+});

+ 7 - 0
client/pages/servant/monthReport/monthReport.json

@@ -0,0 +1,7 @@
+{
+   "defaultTitle": "保姆月报",
+  "usingComponents": {
+    "f2": "@antv/my-f2"
+  }
+
+}

+ 24 - 0
client/pages/servant/reportList/reportList.acss

@@ -0,0 +1,24 @@
+.servantlistpage{
+  padding-top: 27rpx;
+}
+.servantlistitem{
+  height: 102rpx;
+  line-height: 102rpx;
+  background: #FFFFFF;
+  border-radius: 18rpx;
+  font-size: 28rpx;
+  font-weight: bold;
+  margin-bottom: 17rpx;
+}
+.servantlistitem image{
+  width: 9.75rpx;
+  height: 17.2rpx;
+}
+.servantlistitem-left{
+  float: left;
+  padding-left: 28rpx;
+}
+.servantlistitem-right{
+  float: right;
+  padding-right: 31rpx;
+}

+ 11 - 0
client/pages/servant/reportList/reportList.axml

@@ -0,0 +1,11 @@
+<view class="common-page-padding servantlistpage">
+<!---服务列表-->
+  <view class="servantlistitem"  a:for="{{reportList}}" onTap="switchMonthReport" data-reportIndex="{{index}}" key="{{index}}">
+     <view class="servantlistitem-left">{{item.reportTime+'月报'}}</view>
+     <view class="servantlistitem-right">
+      <image mode="scaleToFill" src="/image/icon-right.png"/>
+     </view>
+  </view>
+  
+  
+</view>

+ 23 - 0
client/pages/servant/reportList/reportList.js

@@ -0,0 +1,23 @@
+import request from '../../../util/http'
+import apiUrl from '../../../util/apiUrl'
+var app = getApp();
+Page({
+  data: {
+    reportList:[],
+  },
+  onLoad() {
+     console.log(app.globalData);
+     this.setData({
+       reportList:app.globalData.reportList
+     });
+
+  },
+  switchMonthReport(e){
+    let reportIndex=e.target.dataset.reportIndex;
+    app.globalData.reportInfo=this.data.reportList[reportIndex];
+    console.log(app.globalData.reportInfo);
+    my.navigateTo({
+      url: '../monthReport/monthReport'
+    });
+  }
+});

+ 3 - 0
client/pages/servant/reportList/reportList.json

@@ -0,0 +1,3 @@
+{
+  "defaultTitle":"月报列表"
+}

+ 2 - 2
client/pages/servant/servantCenter/servantCenter.axml

@@ -105,11 +105,11 @@
       </view>
    </view>
    <!-- 月报 -->
-    <view class="common-card module-card">
+    <view class="common-card module-card" onTap="switchReportList">
        <view class="module-text">
       <view class="module-title">
       保姆月报
-      <text class="report-tips">服务时间较短,暂未生成~</text>
+      <text class="report-tips"  a:if="{{noReportShow}}">服务时间较短,暂未生成~</text>
       </view>
       <view class="module-detail">服务回顾 发现问题</view>
       </view>

+ 35 - 1
client/pages/servant/servantCenter/servantCenter.js

@@ -31,7 +31,8 @@ Page({
     workDay:'',//工作日
     serviceType:'',//保姆工种
     completeTaskCount:'',
-    totalTaskCount:''
+    totalTaskCount:'',
+    noReportShow:false,//没有月报
   },
   onLoad(query) {
      console.log(query);
@@ -58,6 +59,7 @@ Page({
     this.isChooseSerStanSubject();
     this.selectTodayTaskItem();
     this.getServantNotice();
+    this.selectMonthlyReport();
   },
   // 获取雇佣关系详情
   initCustomerInfo(){
@@ -387,7 +389,39 @@ Page({
          console.log(e);
        }
 
+  },
+   // 获取月报
+
+   selectMonthlyReport(){
+  
+let params={
+        "employRelationNo":app.globalData.employRelationNo,
+        "reportType": '2',
+    }
+     request.httpServicePost(apiUrl.selectMonthlyReportPath,params).then(data=>{
+        console.log('月报信息response');
+      console.log(data);
+      let noReport=(data.length==0)
+          this.setData({
+      noReportShow: noReport,
+    });
+        if(!noReport){
+          app.globalData.reportList=data;
+        }
+
+          }).catch(e=>{
+           console.log(e);
+           
+        })
+
+  },
+  switchReportList(){
+  if(!this.data.noReportShow){
+        my.navigateTo({
+      url: '../reportList/reportList'
+    });
   }
+}
 
 
 

+ 3 - 1
client/pages/servant/servantlist/servantlist.json

@@ -1 +1,3 @@
-{}
+{
+    "defaultTitle": "选择编辑服务偏好"
+}

+ 1 - 1
client/pages/servant/servantsettings/servantsettings.axml

@@ -2,7 +2,7 @@
 <!--服务设置-->
   <view class="servant-setting-header" a:if="{{tips}}">
     <image mode="scaleToFill" src="/image/notice-blue.png" class="notice-style"/>
-    <text onTap="toservantdetail">您可以查看保姆偏好,双向沟通更清晰</text>
+    <text onTap="toservantdetail">服务标准</text>
     <image mode="scaleToFill" src="/image/close-blue.png" class="close-stle" onTap="closeTip"/>
   </view>
   <!--服务列表-->

+ 1 - 1
client/pages/servant/servantsettings/servantsettings.json

@@ -1,3 +1,3 @@
 {
-    "defaultTitle": "服务标准"
+    "defaultTitle": "服务偏好"
 }