xiaohaizhao пре 2 месеци
родитељ
комит
3d9d15d1e5

+ 244 - 0
CRM/customer/create.js

@@ -0,0 +1,244 @@
+const _Http = getApp().globalData.http;
+
+Page({
+  data: {
+    loading: false,
+    disabled: true,
+    showAll: false,
+    form: [{
+      label: "客户名称",
+      error: false,
+      errMsg: "",
+      type: "text",
+      value: "",
+      placeholder: "请输入客户名称",
+      valueName: "name",
+      required: true,
+      checking: "base"
+    }, {
+      label: "手机",
+      error: false,
+      errMsg: "",
+      type: "number",
+      value: "",
+      placeholder: "请输入手机号码",
+      valueName: "phonenumber",
+      required: true
+    }, {
+      label: "性别",
+      error: false,
+      errMsg: "",
+      type: "radio",
+      value: "",
+      radioList: [{
+          id: "男",
+          name: "男"
+        },
+        {
+          id: "女",
+          name: "女"
+        }
+      ],
+      valueName: "sex",
+      required: false,
+      checking: "base",
+      direction: "horizontal"
+    }, {
+      label: "生日",
+      error: false,
+      errMsg: "",
+      type: "date",
+      value: "",
+      placeholder: "请选择生日",
+      valueName: "birthday",
+      required: false
+    }, {
+      label: "客户来源",
+      error: false,
+      errMsg: "",
+      type: "radio",
+      value: "",
+      radioList: [{
+          id: "线索",
+          name: "线索"
+        },
+        {
+          id: "客户上门",
+          name: "客户上门"
+        },
+        {
+          id: "线上",
+          name: "线上"
+        },
+        {
+          id: "其他",
+          name: "其他"
+        }
+      ],
+      valueName: "source",
+      required: true,
+      checking: "base"
+    }, {
+      label: "选择线索",
+      error: false,
+      errMsg: "",
+      type: "text",
+      value: "未做功能",
+      placeholder: "选择线索",
+      valueName: "sat_orderclueid",
+      required: false,
+      disabled: true
+    }, {
+      label: "外部订单号",
+      error: false,
+      errMsg: "",
+      type: "text",
+      value: "",
+      placeholder: "请输入外部订单号",
+      valueName: "ext_no",
+      required: false,
+      checking: "base"
+    }, {
+      label: "省市县",
+      error: false,
+      errMsg: "",
+      type: "region",
+      value: [],
+      placeholder: "省,市,县",
+      valueName: "region",
+      required: true
+    }, {
+      label: "地址",
+      error: false,
+      errMsg: "",
+      type: "textarea",
+      value: "",
+      placeholder: "请输入详细地址",
+      valueName: "address",
+      required: true,
+      checking: "base"
+    }, {
+      label: "小区及门牌号",
+      error: false,
+      errMsg: "",
+      type: "text",
+      value: "",
+      placeholder: "请输入小区及门牌号",
+      valueName: "community",
+      required: true,
+      checking: "base"
+    }, {
+      label: "备注",
+      error: false,
+      errMsg: "",
+      type: "textarea",
+      value: "",
+      placeholder: "请输入备注",
+      valueName: "remarks",
+      required: false,
+      checking: "base"
+    }],
+    "content": {
+      "sa_customersid": "0"
+    }
+  },
+  onLoad(options) {
+    this.getCustomerSourceList();
+
+  },
+  // 获取客户来源列表
+  getCustomerSourceList() {
+    _Http.basic({
+      "classname": "sysmanage.develop.optiontype.optiontype",
+      "method": "optiontypeselect",
+      "content": {
+        "pageNumber": 1,
+        "pageSize": 1000,
+        "typename": "customersource",
+        "parameter": {}
+      }
+    }).then(res => {
+      console.log("客户来源列表", res);
+      if (res.code == 1 && res.data && res.data.length) {
+        let form = this.data.form;
+        let sourceField = form.find(v => v.valueName == 'source');
+        sourceField.radioList = res.data.map(item => ({
+          id: item.value,
+          name: item.value
+        }));
+        this.setData({
+          form
+        });
+      }
+    }).catch(err => {
+      console.error("获取客户来源列表失败", err);
+    });
+  },
+  submit() {
+    this.setData({
+      loading: true
+    })
+    let content = {
+      ...this.data.content,
+      ...this.selectComponent("#Form").submit()
+    };
+
+    // 处理省市县数据
+    if (content.region && content.region.length) {
+      content.province = content.region[0] || "";
+      content.city = content.region[1] || "";
+      content.county = content.region[2] || "";
+      delete content.region;
+    }
+
+    content.sat_orderclueid = ''
+    _Http.basic({
+      "id": "2026030916370001",
+      content
+    }).then(res => {
+      this.setData({
+        loading: false
+      })
+      console.log("创建客户", res)
+      if (res.code == 1) {
+        wx.navigateTo({
+          url: '/CRM/customer/detail?id=' + res.data.sa_customersid,
+          success: (result) => {
+            wx.showToast({
+              title: "成功",
+              icon: "none"
+            })
+          },
+        })
+      }
+
+
+    })
+  },
+  interrupt({
+    detail
+  }) {
+    // 处理表单中断事件
+  },
+  /* 表单必填项是否完成 */
+  onConfirm({
+    detail
+  }) {
+    this.setData({
+      disabled: detail
+    })
+  },
+  closePage() {
+    wx.navigateBack({
+      delta: 1
+    });
+  },
+  // 是否显示全部
+  onChange({
+    detail
+  }) {
+    this.setData({
+      showAll: detail
+    })
+  }
+});

+ 5 - 0
CRM/customer/create.json

@@ -0,0 +1,5 @@
+{
+  "usingComponents": {
+  },
+  "navigationBarTitleText": "新增客户"
+}

+ 33 - 0
CRM/customer/create.scss

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

+ 8 - 0
CRM/customer/create.wxml

@@ -0,0 +1,8 @@
+<view class="container">
+  <Yl_Headline title='基本信息' type='switch' switchLabel='仅显示必填信息' switch='{{showAll}}' bind:callBack='onChange' />
+  <Yl_Field id='Form' form='{{form}}' showAll='{{!showAll}}' bind:onConfirm='onConfirm' bind:interrupt="interrupt" />
+  <view style="height: 150rpx;" />
+  <view class="new-footer">
+    <van-button custom-class='new-submit' disabled='{{disabled || loading}}' loading='{{loading}}' bindtap='submit'>确定</van-button>
+  </view>
+</view>

+ 6 - 0
CRM/customer/index.js

@@ -64,5 +64,11 @@ Page({
       'content.where.condition': detail
     });
     this.getList(true);
+  },
+  /* 新增客户 */
+  addCustomer() {
+    wx.navigateTo({
+      url: '/CRM/customer/create'
+    });
   }
 });

+ 25 - 0
CRM/customer/index.scss

@@ -7,6 +7,31 @@
   color: #FF4D4F;
 }
 
+.footer {
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  padding-top: 10rpx;
+  padding-bottom: 30rpx;
+  padding-left: 20rpx;
+  padding-right: 20rpx;
+  background-color: #fff;
+  box-shadow: 0 -2rpx 10rpx rgba(0, 0, 0, 0.1);
+  z-index: 999;
+}
+
+.van-button.but {
+  width: 100%;
+  height: 80rpx;
+  line-height: 80rpx;
+  font-size: 32rpx;
+  border-radius: 10rpx;
+  background-color: #3874F6 !important;
+  color: #fff !important;
+  border: none !important;
+}
+
 .header {
   width: 100%;
 }

+ 3 - 0
CRM/customer/index.wxml

@@ -77,6 +77,9 @@
     <Yl_Empty wx:if="{{list.length==0}}" />
     <view style="height:150rpx;" />
   </Yl_ListBox>
+  <view class="footer">
+    <van-button custom-class='but' bindtap="addCustomer">新增客户</van-button>
+  </view>
 </view>
 <wxs module="set">
   module.exports = {

+ 1 - 0
app.json

@@ -116,6 +116,7 @@
       "pages": [
         "customer/index",
         "customer/detail",
+        "customer/create",
         "order/index",
         "order/detail",
         "warehouse/index",

+ 44 - 19
components/Yl_Field/index.wxml

@@ -10,9 +10,12 @@
 				<view class="picker-slot" wx:if="{{item.slot}}">
 					<slot name="{{item.slot}}" />
 				</view>
-				<picker mode='selector' range="{{item.range}}" range-key='{{item.rangeKey}}' value="{{item.rangeIndex}}" disabled="{{item.disabled}}" data-item="{{item}}" data-index="{{index}}" bindchange="bindSelectorChange">
+				<picker mode='selector' range="{{item.range}}" range-key='{{item.rangeKey}}' value="{{item.rangeIndex}}"
+					disabled="{{item.disabled}}" data-item="{{item}}" data-index="{{index}}"
+					bindchange="bindSelectorChange">
 					<view class="content">
-						<text wx:if="{{item.value}}" style="color:{{item.disabled?'#C8C9CC':'#000'}};">{{item.value}}</text>
+						<text wx:if="{{item.value}}"
+							style="color:{{item.disabled?'#C8C9CC':'#000'}};">{{item.value}}</text>
 						<text wx:else style="color: {{item.error?'#EE4C4E':''}};">{{item.placeholder}}</text>
 					</view>
 				</picker>
@@ -29,9 +32,11 @@
 				<view class="picker-slot" wx:if="{{item.slot}}">
 					<slot name="{{item.slot}}" />
 				</view>
-				<picker mode='date' value="{{item.value}}" disabled="{{item.disabled}}" fields='{{item.fields||"day"}}' start="{{item.start}}" end="{{item.end}}" data-item="{{item}}" bindchange="bindDateChange">
+				<picker mode='date' value="{{item.value}}" disabled="{{item.disabled}}" fields='{{item.fields||"day"}}'
+					start="{{item.start}}" end="{{item.end}}" data-item="{{item}}" bindchange="bindDateChange">
 					<view class="content">
-						<text wx:if="{{item.value}}" style="color:{{item.disabled?'#C8C9CC':'#000'}};">{{item.value}}</text>
+						<text wx:if="{{item.value}}"
+							style="color:{{item.disabled?'#C8C9CC':'#000'}};">{{item.value}}</text>
 						<text wx:else style="color: {{item.error?'#EE4C4E':''}};">{{item.placeholder}}</text>
 					</view>
 				</picker>
@@ -49,13 +54,19 @@
 					<slot name="{{item.slot}}" />
 				</view>
 				<view class="content" style="display: flex;">
-					<picker mode='date' value="{{item.value[0]}}" disabled="{{item.disabled}}" fields='{{item.fields||"day"}}' start="{{item.start}}" end="{{item.end}}" data-item="{{item}}" data-index="0" bindchange="rangeDateChange">
-						<text wx:if="{{item.value[0]}}" style="color:{{item.disabled?'#C8C9CC':'#000'}};">{{item.value[0]}}</text>
+					<picker mode='date' value="{{item.value[0]}}" disabled="{{item.disabled}}"
+						fields='{{item.fields||"day"}}' start="{{item.start}}" end="{{item.end}}" data-item="{{item}}"
+						data-index="0" bindchange="rangeDateChange">
+						<text wx:if="{{item.value[0]}}"
+							style="color:{{item.disabled?'#C8C9CC':'#000'}};">{{item.value[0]}}</text>
 						<text wx:else style="color: {{item.error?'#EE4C4E':''}};">{{item.placeholder[0]}}</text>
 					</picker>
 					<view style="margin: 0 20rpx;color: #000;">至</view>
-					<picker mode='date' value="{{item.value[1]}}" disabled="{{item.disabled}}" fields='{{item.fields||"day"}}' start="{{item.value[0]}}" end="{{item.end}}" data-item="{{item}}" data-index="1" bindchange="rangeDateChange">
-						<text wx:if="{{item.value[1]}}" style="color:{{item.disabled?'#C8C9CC':'#000'}};">{{item.value[1]}}</text>
+					<picker mode='date' value="{{item.value[1]}}" disabled="{{item.disabled}}"
+						fields='{{item.fields||"day"}}' start="{{item.value[0]}}" end="{{item.end}}"
+						data-item="{{item}}" data-index="1" bindchange="rangeDateChange">
+						<text wx:if="{{item.value[1]}}"
+							style="color:{{item.disabled?'#C8C9CC':'#000'}};">{{item.value[1]}}</text>
 						<text wx:else style="color: {{item.error?'#EE4C4E':''}};">{{item.placeholder[1]}}</text>
 					</picker>
 				</view>
@@ -72,9 +83,11 @@
 				<view class="picker-slot" wx:if="{{item.slot}}">
 					<slot name="{{item.slot}}" />
 				</view>
-				<picker mode='time' value="{{item.value}}" disabled="{{item.disabled}}" fields='{{item.fields}}' start="{{item.start}}" end="{{item.end}}" data-item="{{item}}" bindchange="bindDateChange">
+				<picker mode='time' value="{{item.value}}" disabled="{{item.disabled}}" fields='{{item.fields}}'
+					start="{{item.start}}" end="{{item.end}}" data-item="{{item}}" bindchange="bindDateChange">
 					<view class="content">
-						<text wx:if="{{item.value}}" style="color:{{item.disabled?'#C8C9CC':'#000'}};">{{item.value}}</text>
+						<text wx:if="{{item.value}}"
+							style="color:{{item.disabled?'#C8C9CC':'#000'}};">{{item.value}}</text>
 						<text wx:else style="color: {{item.error?'#EE4C4E':''}};">{{item.placeholder}}</text>
 					</view>
 				</picker>
@@ -91,9 +104,11 @@
 				<view class="picker-slot" wx:if="{{item.slot}}">
 					<slot name="{{item.slot}}" />
 				</view>
-				<picker mode='region' value="{{item.value}}" disabled="{{item.disabled}}" data-item="{{item}}" bindchange="bindRegionChange">
+				<picker mode='region' value="{{item.value}}" disabled="{{item.disabled}}" data-item="{{item}}"
+					bindchange="bindRegionChange">
 					<view class="content">
-						<text wx:if="{{item.value.length}}" style="color:{{item.disabled?'#C8C9CC':'#000'}};">{{item.value}}</text>
+						<text wx:if="{{item.value.length}}"
+							style="color:{{item.disabled?'#C8C9CC':'#000'}};">{{item.value}}</text>
 						<text wx:else style="color: {{item.error?'#EE4C4E':''}};">{{item.placeholder}}</text>
 					</view>
 				</picker>
@@ -125,9 +140,12 @@
 				<text class="text" style="color:{{item.disabled?'#C8C9CC':''}};">{{item.label}}</text>
 			</view>
 			<view style="position: relative;">
-				<view class="content">
+				<view class="content" style="margin-bottom: -10rpx">
 					<van-radio-group value="{{ item.value }}" data-item="{{item}}" bind:change="radioChange">
-						<van-radio wx:for="{{item.radioList}}" wx:for-item="it" wx:for-index="i" wx:key="it.name" icon-size="16" custom-class="radio {{i != 0 ? 'radio_margin_top' : '' }}" name="{{it.id}}">{{it.name}}</van-radio>
+						<view style="display: flex; flex-wrap: wrap;">
+							<van-radio wx:for="{{item.radioList}}" wx:for-item="it" wx:for-index="i" wx:key="it.name"
+								icon-size="16" custom-class="radio" name="{{it.id}}">{{it.name}}</van-radio>
+						</view>
 					</van-radio-group>
 				</view>
 				<view wx:if="{{item.errMsg}}" class="error-tips">{{item.errMsg}}</view>
@@ -140,8 +158,10 @@
 				<text class="text" style="color:{{item.disabled?'#C8C9CC':''}};">{{item.label}}</text>
 			</view>
 			<view style="position: relative;">
-				<view class="content" style="justify-content: space-between; display: flex; align-items: flex-start;" data-item="{{item}}" bindtap="toOptions">
-					<text wx:if="{{item.value.length}}" style="color:{{item.disabled?'#C8C9CC':'#000'}};">{{item.value}}</text>
+				<view class="content" style="justify-content: space-between; display: flex; align-items: flex-start;"
+					data-item="{{item}}" bindtap="toOptions">
+					<text wx:if="{{item.value.length}}"
+						style="color:{{item.disabled?'#C8C9CC':'#000'}};">{{item.value}}</text>
 					<text wx:else style="color: {{item.error?'#EE4C4E':''}};">{{item.placeholder}}</text>
 					<van-icon name="arrow" style="flex-shrink: 0; margin-top: 12rpx;" />
 				</view>
@@ -155,8 +175,10 @@
 				<text class="text" style="color:{{item.disabled?'#C8C9CC':''}};">{{item.label}}</text>
 			</view>
 			<view style="position: relative;">
-				<view class="content" style="justify-content: space-between; display: flex; align-items: flex-start;" data-item="{{item}}" bindtap="route">
-					<text wx:if="{{item.value.length}}" style="color:{{item.disabled?'#C8C9CC':'#000'}};">{{item.value[0]}}</text>
+				<view class="content" style="justify-content: space-between; display: flex; align-items: flex-start;"
+					data-item="{{item}}" bindtap="route">
+					<text wx:if="{{item.value.length}}"
+						style="color:{{item.disabled?'#C8C9CC':'#000'}};">{{item.value[0]}}</text>
 					<text wx:else style="color: {{item.error?'#EE4C4E':''}};">{{item.placeholder}}</text>
 					<van-icon name="arrow" style="flex-shrink: 0; margin-top: 12rpx;" />
 				</view>
@@ -164,7 +186,10 @@
 			</view>
 		</view>
 		<!-- 输入框 -->
-		<van-field wx:else label="{{item.label}}" required="{{item.required}}" value="{{ item.value }}" placeholder="{{item.placeholder||'请填写'}}" label-class='label-class' type="{{item.type}}" error="{{item.error}}" error-message='{{item.errMsg}}' disabled="{{item.disabled}}" autosize border="{{ false }}" bind:input="inputChange" data-item="{{item}}">
+		<van-field wx:else label="{{item.label}}" required="{{item.required}}" value="{{ item.value }}"
+			placeholder="{{item.placeholder||'请填写'}}" label-class='label-class' type="{{item.type}}"
+			error="{{item.error}}" error-message='{{item.errMsg}}' disabled="{{item.disabled}}" autosize
+			border="{{ false }}" bind:input="inputChange" data-item="{{item}}">
 			<slot wx:if="{{item.slot}}" name="{{item.slot}}" slot='button' />
 		</van-field>
 	</view>

+ 2 - 5
components/Yl_Field/index.wxss

@@ -48,8 +48,5 @@
 
 .radio{
     margin-right: 26rpx;
-}
-
-.radio_margin_top {
-    margin-top: 10px;
-}
+    margin-bottom: 10px;
+}

+ 0 - 1
pages/index/userCenter/userMsg/index.js

@@ -33,7 +33,6 @@ Page({
     },
     onLoad(options) {
         const that = this;
-        getApp().globalData.Language.getLanguagePackage(this, '个人信息')
         this.setData({
             attinfos: JSON.parse(options.attinfos),
             "fromList1[0].value": options.name,

+ 9 - 2
project.private.config.json

@@ -25,12 +25,19 @@
     "miniprogram": {
       "list": [
         {
-          "name": "CRM/warehouse/index",
-          "pathName": "CRM/warehouse/index",
+          "name": "客户列表",
+          "pathName": "CRM/customer/index",
           "query": "",
           "scene": null,
           "launchMode": "default"
         },
+        {
+          "name": "CRM/warehouse/index",
+          "pathName": "CRM/warehouse/index",
+          "query": "",
+          "launchMode": "default",
+          "scene": null
+        },
         {
           "name": "CRM/customer/detail",
           "pathName": "CRM/customer/detail",