<template>
  <a-spin :spinning="confirmLoading">
    <div class="title-top">
      <h3>{{title}}</h3>
      <div class="button"><a-button @click="onCancel">返回</a-button>
        <a-button type="primary" @click="submitForm" v-if="pageType == 'edit' || pageType == 'add' ">保存</a-button>
        <a-button type="danger" @click="onExamine(2)" v-if="pageType == 'audit'">审核驳回</a-button>
        <a-button type="primary" @click="onExamine(1)" v-if="pageType == 'audit'">审核通过</a-button>
      </div>
    </div>

    <j-form-container :disabled="pageType=='detail' || pageType=='audit'||creditCodeChangeBool">
      <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
        <a-card title="新增商铺基本信息">
          <a-row>
            <a-col :span="12">
              <a-form-model-item label="关联楼栋单元" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="roomId" v-if="!(pageType=='detail' || pageType=='audit')">
                <a-tree-select
                  v-model=" model.roomId"
                  style="width: 100%"
                  :defaultExpandAll="true"
                  :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
                  :tree-data="treeData"
                  :load-data="onLoadData"
                  placeholder="请选择关联房屋"
                  @select="onSelectRoom"
                />
              </a-form-model-item>
              <a-form-model-item v-else label="关联楼栋单元" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="roomName">
                <a-input v-model="model.roomName" placeholder="请输入商铺名称"></a-input>
              </a-form-model-item>
            </a-col>
            <a-col :span="12">
              <p style="line-height:30px">{{model.buildingName}}{{model.unitName}}{{model.roomName}}</p>
            </a-col>
          </a-row>
          <a-row>
            <a-col :span="12">
              <a-form-model-item label="商铺名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="shopName">
                <a-input v-model="model.shopName" placeholder="请输入商铺名称"></a-input>
              </a-form-model-item>
            </a-col>
            <a-col :span="12">
              <a-form-model-item label="营业执照代码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="creditCode">
                <a-input v-model="model.creditCode" placeholder="请输入营业执照代码" @blur="creditCodeChange"></a-input>
              </a-form-model-item>
            </a-col>
            <a-col :span="12">
              <a-form-model-item label="法人代表" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="legalName">
                <a-input v-model="model.legalName" placeholder="请输入法人代表"></a-input>
              </a-form-model-item>
            </a-col>
          </a-row>
          <a-row>
            <a-col :span="12">
              <a-form-model-item label="联系人" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="contactName">
                <a-input v-model="model.contactName" placeholder="请输入联系人"></a-input>
              </a-form-model-item>
            </a-col>
            <a-col :span="12">
              <a-form-model-item label="联系人电话" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="contactPhone">
                <a-input @blur="contactPhoneChange" v-model="model.contactPhone" placeholder="请输入联系人电话"></a-input>
              </a-form-model-item>
            </a-col>
            <a-col :span="12">
              <a-form-model-item label="注册地址" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="registAdress">
                <area-cascader v-model="model.registAdress" :data="pcaa" :level="1" type="all" @change="addressChange"
                               style="width:100%" />
              </a-form-model-item>
            </a-col>
            <a-col :span="24">
              <a-form-model-item label="详细地址" :labelCol="{ xs:{ span: 24 }, sm:{ span: 3 } }" :wrapperCol="wrapperCol"
                                 prop="addressInfo">
                <a-input v-model="model.addressInfo" placeholder="请输入详细地址" @blur="addressBlur"></a-input>
              </a-form-model-item>
            </a-col>
            <a-col :span="24">
              <a-form-model-item label="" :offset="3" :pull="3" :labelCol="{ xs:{ span: 24 }, sm:{ span: 3 } }">
                <div class="hhh">
                  <div id="container" style="width:100%;height:200px"></div>
                </div>
              </a-form-model-item>
            </a-col>
            <a-col :span="24">
              <a-form-model-item label="LOGO" :labelCol="{ xs:{ span: 24 }, sm:{ span: 3 } }" :wrapperCol="wrapperCol"
                                 prop="logoUrl">
                <j-image-upload bizPath="scott/pic" v-model="model.logoUrl"></j-image-upload>
              </a-form-model-item>
            </a-col>
            <a-col :span="24">
              <a-form-model-item label="介绍" :labelCol="{ xs:{ span: 24 }, sm:{ span: 3 } }" :wrapperCol="wrapperCol"
                                 prop="shopContent">
                <a-textarea v-model="model.shopContent" placeholder="请输入介绍" :maxLength="500"
                            :auto-size="{ minRows: 3, maxRows: 5 }" />
              </a-form-model-item>
            </a-col>


          </a-row>
        </a-card>
        <a-card title="合同附件" style="margin-top: 10px;"  >
          <a-row>
            <a-col :span="24">
              <a-form-model-item label="合同附件" :labelCol="{ xs:{ span: 24 }, sm:{ span: 3 } }" :wrapperCol="wrapperCol">
                <j-upload v-model="model.contractUrl" ></j-upload>
              </a-form-model-item>
            </a-col>
          </a-row>
        </a-card>
        <a-card title="商铺管理员"  style="margin-top: 10px;">
          <a-row>
            <a-col :span="12">
              <a-form-model-item label="管理员账户" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="adminLoginName">
                <a-input v-model="model.adminLoginName" placeholder="请输入管理员账户"></a-input>
              </a-form-model-item>
            </a-col>
            <a-col :span="12">
              <a-form-model-item label="管理员密码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="adminPassword">
                <a-input v-model="model.adminPassword" placeholder="请输入管理员密码"></a-input>
              </a-form-model-item>
            </a-col>
            <a-col :span="12" style="position:relative">
              <a-form-model-item label="访问域名前缀" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="accessAddress"
                                 v-if="pageType=='add' || pageType=='edit'">
                <a-input v-model="model.accessAddress" placeholder="请输入访问域名前缀"
                         addon-after=".shop.hjxbc.cn"></a-input>
              </a-form-model-item>
              <a-form-model-item label="访问域名" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="accessAddress"
                                 :disabled="false" v-else>
                <p v-if="model.accessAddress">{{ model.accessAddress }}.shop.hjxbc.cn</p>
              </a-form-model-item>
              <a @click="onCopyLink" v-if="model.accessAddress" style="position:absolute;top:0;right:-10px;line-height:40px;z-index:999;pointer-events:auto;">复制</a>
            </a-col>

          </a-row>

        </a-card>
        <a-card title="商铺二维码" v-if="pageType != 'add'"  style="margin-top: 10px;">
          <a-row>
            <img :src="shopQrcode" alt="商铺二维码"  class="shopQrcode">
          </a-row>

        </a-card>
        <a-card title="审核记录" v-if="pageType != 'add'"  style="margin-top: 10px;">
          <a-row>
            <a-table
              ref="table"
              size="middle"
              bordered
              rowKey="id"
              :columns="columns"
              :dataSource="dataSource"
              :pagination="false"
              :loading="loading"
              class="j-table-force-nowrap"
            >
            </a-table>
          </a-row>

        </a-card>
      </a-form-model>
    </j-form-container>
  </a-spin>
</template>

<script>
import { filterDictTextByCache } from '@comp/dict/JDictSelectUtil'
const mapZoom = [5, 8, 10, 12]
let timer = null
import {shopDetailApi, shopAuditApi, getBuildingListApi, getUnitListApi, getRoomListApi} from '@/api/api'
import { httpAction, getAction } from '@/api/manage'
import { isMobile, alphanumeric } from '@/utils/validate'
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
import {axios} from '@/utils/request'
const columns = [
  {
    title: '操作人',
    dataIndex: 'createBy',
    key: 'createBy',
    align: 'center',
  },
  {
    title: '部门',
    dataIndex: 'departName',
    key: 'departName',
    align: 'center',
  },
  {
    title: '操作类型',
    dataIndex: 'operateType',
    key: 'operateType',
    align: 'center',
  },
  {
    title: '审核状态',
    dataIndex: 'auditStatus',
    key: 'auditStatus',
    align: 'center',
  },
  {
    title: '操作时间',
    dataIndex: 'createTime',
    key: 'createTime',
    align: 'center',
  }
]
export default {
  name: 'PropertySettledForm',
  mixins: [JeecgListMixin],
  inject: ['closeCurrent'],
  data() {
    const validateToNextPhone = (rule, value, callback) => {
      if (value && isMobile(value)) {
        callback()
      } else {
        callback('请输入正确的联系人电话!')
      }
    }
    const isAlphanumeric = (rule, value, callback) => {
      if (value && alphanumeric(value)) {
        callback()
      } else {
        callback('请输入带字母的域名前缀')
      }
    }
    return {
      title: '',
      pageType: '',
      columns: columns,
      creditCodeChangeBool: false,
      pcaa: this.$Jpcaa,
      model: {
        buildingId: '',
        buildingName: '',
        unitId: '',
        unitName: '',
        roomId: '',
        roomName: '',
        useTo: '',
        shopName: '',
        legalName: '',
        creditCode: '',
        contactName: '',
        contactPhone: '',
        registAdress: [],
        provinceName: '',
        provinceCode: '',
        cityName: '',
        cityCode: '',
        countyName: '',
        countyCode: '',
        addressInfo: '',
        logoUrl: '',
        shopContent: '',
        chargingStandardId: '',
        contractUrl: '',
        longitude: '',
        latitude: '',
        accessAddress: '',
        adminPassword: '123456'
      },
      labelCol: {
        xs: { span: 24 },
        sm: { span: 6 },
      },
      wrapperCol: {
        xs: { span: 24 },
        sm: { span: 16 },
      },
      confirmLoading: false,
      validatorRules: {
        roomId: [{ required: true, message: '请选择关联房屋', trigger: 'change' }],
        shopName: [{ required: true, message: '请输入商铺名称', trigger: 'blur' }],
        legalName: [{ required: true, message: '请输入法人代表', trigger: 'blur' }],
        creditCode: [{ required: true, message: '请输入营业执照代码', trigger: 'blur' }],
        contactName: [{ required: true, message: '请输入联系人', trigger: 'blur' }],
        contactPhone: [
          { required: true, message: '请输入联系人电话', trigger: 'blur' },
          { validator: validateToNextPhone },
        ],
        registAdress: [{ required: true, message: '请选择注册地址', trigger: 'change' }],
        addressInfo: [{ required: true, message: '请输入详细地址', trigger: 'blur' }],
        logoUrl: [{ required: true, message: '请上传LOGO', trigger: 'change' }],
        // adminLoginName: [{ required: true, message: '请输入管理员账号', trigger: 'blur' }],
        contractUrl: [{ required: true, message: '请上传合同附件', trigger: 'change' }],
        adminPassword: [{ required: true, message: '请输入管理员密码', trigger: 'blur' }],
        accessAddress: [
          { required: true, message: '请输入访问域名前缀', trigger: 'blur' },
          { validator: isAlphanumeric },
        ],
      },
      url: {
        list: '/property-central/property/auditRecord/list?settledId='+this.$route.query.id,
        code: '/property-central/shop/shopInfo/getList',
        add: '/property-central/shop/shopInfo/add',
        edit: '/property-central/shop/shopInfo/edit',
      },
      treeData: [],
      shopQrcode: '',
      mapRef: null,
    }
  },
  computed: {
    formDisabled() {
      return this.disabled
    },
  },
  watch: {
    'model.addressInfo': {
      handler(newV) {
        if (newV) {
          clearTimeout(timer)
          timer = setTimeout(() => {
            // this.getLongitude(this.model.categoryCodes[0], this.model.categoryCodes.join('') + newV, mapZoom[3])
          }, 1000)
        }
      },
    },
  },
  created() {
    //备份model原始值
    //this.modelDefault = JSON.parse(JSON.stringify(this.model))
    this.pageType = this.$route.query.type

    if (this.$route.query.type == 'add') {
      this.title = '新增'
    } else if (this.$route.query.type == 'edit') {
      this.title = '编辑'
    } else if (this.$route.query.type == 'audit') {
      this.title = '审核'
    } else if (this.$route.query.type == 'detail') {
      this.title = '详情'
    }
    if (this.$route.query.id) {
      this.getPageDetail()
    }
  },
  mounted() {
    this.getBuildingList()
    this.mapRef = new BMapGL.Map('container') // 创建地图实例
    var point = new BMapGL.Point(108.5525, 34.3237) // 创建点坐标
    this.mapRef.centerAndZoom(point, mapZoom[0])
    // var zoomCtrl = new BMapGL.ZoomControl();  // 添加缩放控件
    // this.mapRef.addControl(zoomCtrl);
    this.mapRef.enableScrollWheelZoom(true) //开启鼠标滚轮缩放
    this.mapRef.addEventListener('click', (e) => this.getAddress(e))
  },
  methods: {
    async getBuildingList() {
      let {result} = await getBuildingListApi()
      this.treeData = result.map(item=> {
        return {
          value: item.id,
          label: item.buildingName,
          pId: 0,
          disabled: true
        }
      })
    },
    shopQrcodes() {
      axios('/property-central/shop/shopInfo/getQrCode?shopCode='+this.model.shopCode+'&platformType=cell',{ responseType: 'blob',}).then(res=>{
        this.shopQrcode = window.URL.createObjectURL(new Blob([res]))
        console.log(this.shopQrcode)
      })
    },
    onSelectRoom(value, node) {
      let data = node.dataRef
      this.model.roomId = data.value
      this.model.roomName = data.label
      this.model.useTo = data.useTo
      this.model.floorSpace = data.floorSpace
      this.model.unitId = data.parent.value
      this.model.unitName = data.parent.label
      this.model.buildingId = data.parent.parent.value
      this.model.buildingName = data.parent.parent.label
      console.log(this.model)
    },
    onLoadData(treeNode) {
      return new Promise(async resolve => {
        if (treeNode.dataRef.children) {
          resolve();
          return;
        }
        if(treeNode.pos.split('-').length === 2) {  // 单元
          let {result} = await getUnitListApi({id: treeNode.eventKey})
          treeNode.dataRef.children = result.map(item=> {
            return {
              value: item.id,
              label: item.unitName,
              pId: treeNode.dataRef.id,
              parent: {...treeNode.dataRef},
              disabled: true
            }
          })
          this.treeData = [...this.treeData];
          resolve();
        } else {  // 房屋
          let {result} = await getRoomListApi({id: treeNode.eventKey})
          treeNode.dataRef.children = result.map(item=> {
            return {
              value: item.id,
              label: item.roomNum,
              pId: treeNode.dataRef.id,
              useTo: item.useTo,
              floorSpace: item.floorSpace,
              parent: {...treeNode.dataRef},
              isLeaf: true
            }
          })
          this.treeData = [...this.treeData];
          resolve();
        }
      });
    },
    async getPageDetail() {
      let { result } = await shopDetailApi({ id: this.$route.query.id })
      this.edit(result)
      if (result.provinceName) {
        this.getLongitude(
          result.provinceName,
          result.provinceName + result.cityName + result.countyName + result.addressInfo,
          mapZoom[3]
        )
      }
    },
    onCancel() {
      this.closeCurrent()
    },
    creditCodeChange() {
      getAction(this.url.code, { creditCode: this.model.creditCode }).then(res => {
        console.log(res)
        if (res.success) {
         if(res.result.length > 0){
          this.creditCodeChangeBool = true;
          this.creditCodeChangeBoolBool = true;
         }else {
          this.creditCodeChangeBool = false;
         }
        }
      })
    },
    contactPhoneChange(e) {
      if (!this.model.adminLoginName) {
        this.model.adminLoginName = e.target.value
      }
    },
    edit(record) {
      this.model = Object.assign({}, record)
      this.shopQrcodes()
      this.model.registAdress = [record.provinceCode, record.cityCode, record.countyCode]
      this.visible = true
    },
    onExamine(type) {
      const that = this
      if (type == 1) {
        return shopAuditApi({
          id: this.$route.query.id,
          auditStatus: 'auditPass',
        }).then((res) => {
          that.$message.success('审核通过成功')
          that.$emit('ok')
          this.onCancel()
        })
      } else if (type == 2) {
        return shopAuditApi({
          id: this.$route.query.id,
          auditStatus: 'refuse',
        }).then((res) => {
          that.$message.success('审核驳回成功')
          this.onCancel()
        })
      }
    },
    addressChange(val) {
      const province = Object.keys(val[0])[0]
      const city = Object.keys(val[1])[0]
      const county = Object.keys(val[2])[0]
      this.model.provinceName = val[0][province]
      this.model.provinceCode = province
      this.model.cityName = val[1][city]
      this.model.cityCode = city
      this.model.countyName = val[2][county]
      this.model.countyCode = county
      if (this.model.addressInfo) {
        this.getLongitude(
          this.model.provinceName,
          this.model.provinceName + this.model.cityName + this.model.countyName + this.model.addressInfo,
          mapZoom[3]
        )
      }
    },
    addressBlur(val) {
      if (this.model.provinceName) {
        this.getLongitude(
          this.model.provinceName,
          this.model.provinceName + this.model.cityName + this.model.countyName + val.target.value,
          mapZoom[3]
        )
      }
    },
    getAddress(e) {
      let _this = this
      // 创建地理编码实例
      var myGeo = new BMapGL.Geocoder()
      // 根据坐标得到地址描述
      myGeo.getLocation(new BMapGL.Point(e.latlng.lng, e.latlng.lat), function (result) {
        if (result) {
          _this.mapRef.clearOverlays()
          _this.model.registAdress = [
            result.addressComponents.province,
            result.addressComponents.city,
            result.addressComponents.district,
          ]
          _this.model.addressInfo = result.addressComponents.street + result.addressComponents.streetNumber
          _this.model.longitude = result.point.lng
          _this.model.latitude = result.point.lat
          _this.positionMap(e.latlng.lng, e.latlng.lat, mapZoom[3], result.address)
          console.log(result)
        }
      })
    },
    positionMap(mapCenterLng, mapCenterLat, mapzoom, address) {
      var point = new BMapGL.Point(mapCenterLng, mapCenterLat) // 创建点坐标
      this.mapRef.centerAndZoom(point, mapzoom)
      var marker = new BMapGL.Marker(point, { title: address }) // 创建标注
      this.mapRef.addOverlay(marker) // 将标注添加到地图中
      let _this = this
      // marker.addEventListener("click", function(){
      var label = new BMapGL.Label(address, {
        // 创建文本标注
        position: point, // 设置标注的地理位置
        offset: new BMapGL.Size(0, -55), // 设置标注的偏移量
      })
      _this.mapRef.addOverlay(label) // 将标注添加到地图中
      label.setStyle({
        // 设置label的样式
        color: '#333',
        fontSize: '14px',
        padding: '4px 10px',
        border: '1px solid #1E90FF',
        borderRadius: '4px',
        transform: 'translateX(-40%)',
      })
      // });
    },
    getLongitude(city, address, zoom) {
      let _this = this
      var myGeo = new BMapGL.Geocoder()
      myGeo.getPoint(
        address,
        function (point) {
          if (point) {
            _this.mapRef.clearOverlays()
            _this.model.longitude = point.lng
            _this.model.latitude = point.lat
            _this.positionMap(point.lng, point.lat, zoom, address)
          } else {
            console.log('您选择的地址没有解析到结果!')
          }
        },
        city
      )
    },
    onCopyLink() {
      let txa = document.createElement("textarea");
      txa.value = this.model.accessAddress + '.shop.hjxbc.cn'
      document.body.appendChild(txa);
      txa.select();
      document.execCommand("copy");
      document.body.removeChild(txa);
      this.$message.success("复制成功!");
    },
    submitForm() {
      const that = this
      // 触发表单验证
      this.$refs.form.validate((valid) => {

        if (valid) {
          that.confirmLoading = true
          let httpurl = ''
          let method = ''
          if (!this.model.id) {
            httpurl += this.url.add
            method = 'post'
          } else {
            httpurl += this.url.edit
            method = 'put'
          }
          //this.model.registAdress = undefined
          httpAction(httpurl, this.model, method)
            .then((res) => {
              if (res.success) {
                that.$message.success(res.message)
                that.$emit('ok')
                this.onCancel()
              } else {
                that.$message.warning(res.message)
              }
            })
            .finally(() => {
              that.confirmLoading = false
            })
        }
      })
    },
  },
  beforeDestroy() {
    clearTimeout(timer)
    this.mapRef.removeEventListener('click', (e) => this.getAddress(e))
  },
}
</script>
<style lang="less" scoped>
.title-top {
  background: #fff;
  padding: 0 25px;
  line-height: 50px;
  height: 50px;
  margin-bottom: 5px;
  h3 {
    font-weight: bold;
    display: inline-block;
  }
  .button {
    float: right;
    .ant-btn {
      margin-left: 15px;
    }
  }
}
</style>
<style>
.area-select {
  width: 100% !important;
}
.anchorBL{
  visibility: hidden;
}
</style>