/// <summary>
        /// 新增价格体系配置
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public ActionResult AddPackageConfig(PaintDiscountPackageModel model)
        {
            if (model == null)
            {
                return(Json(new { Status = false, Msg = "未知的添加对象" }, JsonRequestBehavior.AllowGet));
            }
            else if (string.IsNullOrWhiteSpace(model.PackageName))
            {
                return(Json(new { Status = false, Msg = "活动名称不能为空" }, JsonRequestBehavior.AllowGet));
            }
            else if (!Enum.IsDefined(typeof(UserType), model.UserType))
            {
                return(Json(new { Status = false, Msg = "未定义的用户类型" }, JsonRequestBehavior.AllowGet));
            }
            var manager = new PaintDiscountConfigManager();
            var isExist = manager.IsExistPaintDiscountPackage(model);

            if (isExist)
            {
                return(Json(new { Status = false, Msg = "活动已存在,不能重复编辑" }, JsonRequestBehavior.AllowGet));
            }
            var user   = User.Identity.Name;
            var result = manager.AddPaintDiscountPackage(model, user);

            return(Json(new { Status = result > 0, Msg = $"添加{(result > 0 ? "成功" : "失败")}", PackageId = result }
                        , JsonRequestBehavior.AllowGet));
        }
        /// <summary>
        /// 刷新喷漆打折旧配置的服务缓存
        /// </summary>
        /// <returns></returns>
        public ActionResult RefreshPaintDiscountPaintCache()
        {
            var manager = new PaintDiscountConfigManager();
            var result  = manager.RefreshPaintDiscountConfigCache();

            return(Json(new { Status = result, Msg = $"刷新缓存{(result ? "成功" : "失败")}" }, JsonRequestBehavior.AllowGet));
        }
        /// <summary>
        /// 获取该价格体系的城市门店展示
        /// </summary>
        /// <param name="packageId"></param>
        /// <returns></returns>
        public ActionResult GetPackageRegionForView(int packageId)
        {
            var manager = new PaintDiscountConfigManager();
            var result  = manager.GetPackageRegionForView(packageId);

            return(Json(new { Status = result != null, Data = result }, JsonRequestBehavior.AllowGet));
        }
        /// <summary>
        /// 获取喷漆打折配置
        /// </summary>
        /// <param name="servicePid"></param>
        /// <param name="carNoPrefix"></param>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <returns></returns>
        public ActionResult SelectPaintConfig(string servicePid, int packageId = 0, int pageIndex = 1, int pageSize = 20)
        {
            var manager = new PaintDiscountConfigManager();
            var result  = manager.SelectPaintDiscountConfig(packageId, servicePid, pageIndex, pageSize);

            return(Json(new { Status = result != null && result.Item1 != null, Data = result.Item1, TotalCount = result.Item2 }, JsonRequestBehavior.AllowGet));
        }
        /// <summary>
        /// 批量更新喷漆打折配置
        /// </summary>
        /// <param name="models"></param>
        /// <returns></returns>
        public ActionResult MultUpdatePaintConfig(List <PaintDiscountConfigModel> models, string activityImage)
        {
            if (models == null || !models.Any())
            {
                return(Json(new { Status = false, Msg = "未知的编辑对象" }, JsonRequestBehavior.AllowGet));
            }
            if (string.IsNullOrEmpty(activityImage))
            {
                return(Json(new { Status = false, Msg = "活动图片不能为空" }, JsonRequestBehavior.AllowGet));
            }
            var manager = new PaintDiscountConfigManager();

            foreach (var model in models)
            {
                if (string.IsNullOrWhiteSpace(model.ServicePid) || model.SurfaceCount < 1)
                {
                    return(Json(new { Status = false, Msg = "所有记录的PID不能为空和面数须大于0" }, JsonRequestBehavior.AllowGet));
                }
                else
                {
                    model.ActivityImage = activityImage;
                }
            }
            var user   = User.Identity.Name;
            var result = manager.MultUpdatePaintConfig(models, user);

            return(Json(new { Status = result, Msg = $"编辑{(result ? "成功" : "失败")}" }, JsonRequestBehavior.AllowGet));
        }
        /// <summary>
        /// 更新喷漆打折配置
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public ActionResult UpdatePaintConfig(PaintDiscountConfigModel model)
        {
            if (model == null || string.IsNullOrWhiteSpace(model.ServicePid) || model.SurfaceCount < 1)
            {
                return(Json(new { Status = false, Msg = "未知的编辑对象" }, JsonRequestBehavior.AllowGet));
            }
            if (!(model.ActivityPrice > 0))
            {
                return(Json(new { Status = false, Msg = "活动价格须大于0" }, JsonRequestBehavior.AllowGet));
            }
            if (string.IsNullOrWhiteSpace(model.ActivityName))
            {
                return(Json(new { Status = false, Msg = "权益名称不能为空" }, JsonRequestBehavior.AllowGet));
            }
            if (string.IsNullOrWhiteSpace(model.ActivityImage))
            {
                return(Json(new { Status = false, Msg = "活动图片不能为空" }, JsonRequestBehavior.AllowGet));
            }
            var manager = new PaintDiscountConfigManager();
            var isExist = manager.IsExistPaintDiscountConfig(model);

            if (isExist)
            {
                return(Json(new { Status = false, Msg = "已存在重复的数据,不能重复编辑" }, JsonRequestBehavior.AllowGet));
            }
            var user   = User.Identity.Name;
            var result = manager.UpdatePaintDiscountConfig(model, user);

            return(Json(new { Status = result, Msg = $"编辑{(result ? "成功" : "失败")}" }, JsonRequestBehavior.AllowGet));
        }
        /// <summary>
        /// 获取所有二级城市
        /// </summary>
        /// <returns></returns>
        public ActionResult GetAllRegions()
        {
            var manager = new PaintDiscountConfigManager();
            var result  = manager.GetAllRegion();

            return(Json(new { Status = result != null, Data = result }, JsonRequestBehavior.AllowGet));
        }
        public ActionResult UploadExcel()
        {
            var files = Request.Files;

            if (files.Count < 1)
            {
                return(Json(new { Status = false, Msg = "请选择文件" }, JsonRequestBehavior.AllowGet));
            }
            var file = files[0];

            if (file.ContentType != "application/vnd.ms-excel" &&
                file.ContentType != "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
            {
                return(Json(new { Status = false, Msg = "请上传Excel文件" }, JsonRequestBehavior.AllowGet));
            }
            var convertResult = ConvertExcelToList(file);

            if (!string.IsNullOrEmpty(convertResult.Item2))
            {
                return(Json(new { Status = false, Msg = convertResult.Item2 }, JsonRequestBehavior.AllowGet));
            }
            else if (convertResult.Item1 == null || !convertResult.Item1.Any())
            {
                return(Json(new { Status = false, Msg = "Excel内容为空" }, JsonRequestBehavior.AllowGet));
            }
            else
            {
                var manager = new PaintDiscountConfigManager();
                var user    = User.Identity.Name;
                var result  = manager.UploadPaintDiscountConfig(convertResult.Item1, user);
                return(Json(new { Status = result, Msg = $"导入{(result ? "成功" : "失败")}" }
                            , JsonRequestBehavior.AllowGet));
            }
        }
        /// <summary>
        /// 查询价格体系配置
        /// </summary>
        /// <param name="packageName"></param>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <returns></returns>
        public ActionResult SelectPackageConfigForView(int packageId, int userType, int pageIndex = 1, int pageSize = 20)
        {
            var manager = new PaintDiscountConfigManager();
            var result  = manager.SelectPaintDiscountPackageForView(packageId, userType, pageIndex, pageSize);

            return(Json(new { Status = result.Item1 != null, Data = result.Item1, TotalCount = result.Item2 },
                        JsonRequestBehavior.AllowGet));
        }
        /// <summary>
        /// 获取该城市下所有喷漆门店
        /// </summary>
        /// <param name="cityId"></param>
        /// <returns></returns>
        public ActionResult GetPaintShopsByRegionId(int regionId)
        {
            if (regionId < 1)
            {
                return(Json(new { Status = false, Msg = "未知的城市" }, JsonRequestBehavior.AllowGet));
            }
            var manager = new PaintDiscountConfigManager();
            var result  = manager.GetAllPaintShopsByRegionId(regionId);

            return(Json(new { Status = result.Any(), Data = result }, JsonRequestBehavior.AllowGet));
        }
        public ActionResult DeletePaintConfig(PaintDiscountConfigModel model)
        {
            if (string.IsNullOrWhiteSpace(model.ServicePid) || model.SurfaceCount < 1)
            {
                return(Json(new { Status = false, Msg = "未知的删除对象" }, JsonRequestBehavior.AllowGet));
            }
            var manager = new PaintDiscountConfigManager();
            var user    = User.Identity.Name;
            var result  = manager.DeletePaintDiscountConfig(model.PackageId, model.ServicePid, model.SurfaceCount, user);

            return(Json(new { Status = result, Msg = $"删除{(result ? "成功" : "失败")}" }, JsonRequestBehavior.AllowGet));
        }
        public JsonResult GetPaintDiscountOprLog(string servicePid, int surfaceCount, int packageId = 0)
        {
            if (string.IsNullOrEmpty(servicePid) || surfaceCount < 1)
            {
                return(Json(new { Status = false, Msg = "未知的对象" }, JsonRequestBehavior.AllowGet));
            }
            var logType    = "PaintDiscountConfig";
            var identityID = $"{packageId}_{servicePid}_{surfaceCount}";
            var manager    = new PaintDiscountConfigManager();
            var result     = manager.SelectPaintDiscountOprLog(logType, identityID);

            return(Json(new { Status = result != null, Data = result }, JsonRequestBehavior.AllowGet));
        }
        /// <summary>
        /// 编辑城市门店配置
        /// </summary>
        /// <param name="packageId"></param>
        /// <param name="regionShops"></param>
        /// <returns></returns>
        public ActionResult UpsertPackageRegion(int packageId, string regionShops)
        {
            if (packageId < 0)
            {
                return(Json(new { Status = false, Msg = "未知的喷漆打折价格体系" }, JsonRequestBehavior.AllowGet));
            }
            if (string.IsNullOrWhiteSpace(regionShops))
            {
                return(Json(new { Status = false, Msg = "请配置门店和城市" }, JsonRequestBehavior.AllowGet));
            }
            var manager = new PaintDiscountConfigManager();
            var package = manager.GetPaintDiscountPackage(packageId);

            if (package == null)
            {
                return(Json(new { Status = false, Msg = "未知的喷漆打折价格体系" }, JsonRequestBehavior.AllowGet));
            }
            var regionShopPair = null as List <RegionShopPairModel>;

            try
            {
                regionShopPair = JsonConvert.DeserializeObject <List <RegionShopPairModel> >(regionShops);
            }
            catch (Exception)
            {
                regionShopPair = null;
            }
            if (regionShopPair != null && regionShopPair.Any())
            {
                if (regionShopPair.Any(s => (s.RegionId < 1 && s.ShopIds != null && s.ShopIds.Any()) ||
                                       (s.ShopIds != null && s.ShopIds.Any(v => v < 1))))
                {
                    return(Json(new { Status = false, Msg = $"未知的门店" }, JsonRequestBehavior.AllowGet));
                }
                var list  = manager.ConvertToPackageRegionModel(packageId, regionShopPair);
                var exist = manager.GetRepeatPackageRegion(packageId, package.UserType, list);
                if (exist != null && exist.Any())
                {
                    return(Json(new { Status = false, Msg = string.Join("</br>", exist) }, JsonRequestBehavior.AllowGet));
                }
                var result = manager.UpsertPackageRegion(packageId, package.UserType, list, User.Identity.Name);
                return(Json(new { Status = result, Msg = $"编辑{(result ? "成功" : "失败")}" }, JsonRequestBehavior.AllowGet));
            }
            else
            {
                return(Json(new { Status = false, Msg = $"请配置门店和城市" }, JsonRequestBehavior.AllowGet));
            }
        }
        /// <summary>
        /// 移除喷漆打折详情缓存
        /// </summary>
        /// <param name="packageId"></param>
        /// <param name="servicePid"></param>
        /// <returns></returns>
        public ActionResult RemovePaintDiscountDetailCache(int packageId, string servicePid = "")
        {
            var manager = new PaintDiscountConfigManager();
            var result  = false;

            if (string.IsNullOrWhiteSpace(servicePid))
            {
                result = manager.RefreshPaintDiscountConfigCache(packageId);
            }
            else
            {
                var cacheKey = $"PaintDiscountPackageDetail/{packageId}/{servicePid}";
                result = manager.RemovePaintRedisCache(cacheKey);
            }
            return(Json(new { Status = result, Msg = $"刷新缓存{(result ? "成功" : "失败")}" }, JsonRequestBehavior.AllowGet));
        }
        /// <summary>
        /// 导出数据至Excel
        /// </summary>
        /// <returns></returns>
        public ActionResult ExportExcel()
        {
            var workbook = new XSSFWorkbook();
            var sheet    = workbook.CreateSheet();

            var row     = sheet.CreateRow(0);
            var cell    = null as ICell;
            var cellNum = 0;

            row.CreateCell(cellNum++).SetCellValue("PID");
            row.CreateCell(cellNum++).SetCellValue("面数");
            row.CreateCell(cellNum++).SetCellValue("活动价");
            row.CreateCell(cellNum++).SetCellValue("权益名称");
            row.CreateCell(cellNum++).SetCellValue("活动说明");
            row.CreateCell(cellNum++).SetCellValue("活动图片");
            cellNum = 0;
            sheet.SetColumnWidth(cellNum++, 14 * 256);
            sheet.SetColumnWidth(cellNum++, 8 * 256);
            sheet.SetColumnWidth(cellNum++, 18 * 256);
            sheet.SetColumnWidth(cellNum++, 50 * 256);
            sheet.SetColumnWidth(cellNum++, 50 * 256);
            sheet.SetColumnWidth(cellNum++, 28 * 256);
            var manager = new PaintDiscountConfigManager();
            var result  = manager.SelectPaintDiscountConfig("", 1, 10000);

            if (result != null && result.Item1 != null && result.Item1.Any())
            {
                int modelRowCount = 1;
                foreach (var model in result.Item1)
                {
                    int modelCol = 0;
                    var modelRow = sheet.CreateRow(modelRowCount);
                    modelRow.CreateCell(modelCol++).SetCellValue(model.ServicePid);
                    modelRow.CreateCell(modelCol++).SetCellValue(model.SurfaceCount);
                    modelRow.CreateCell(modelCol++).SetCellValue((double)model.ActivityPrice);
                    modelRow.CreateCell(modelCol++).SetCellValue(model.ActivityName);
                    modelRow.CreateCell(modelCol++).SetCellValue(model.ActivityExplain);
                    modelRow.CreateCell(modelCol++).SetCellValue(model.ActivityImage);
                    modelRowCount++;
                }
            }
            var ms = new MemoryStream();

            workbook.Write(ms);
            return(File(ms.ToArray(), "application/x-xls", $"喷漆打折配置 {DateTime.Now.ToString("yyyy年MM月dd日HH时mm分ss秒")}.xlsx"));
        }
        /// <summary>
        /// 移除喷漆打折城市配置缓存
        /// </summary>
        /// <param name="regionId"></param>
        /// <param name="userType"></param>
        /// <returns></returns>
        public ActionResult RemovePackageRegionCache(int packageId, List <int> regionIds)
        {
            var result = false;

            if (packageId < 1 || regionIds == null || !regionIds.Any())
            {
                return(Json(new { Status = false, Msg = "未知的对象" }, JsonRequestBehavior.AllowGet));
            }
            var manager   = new PaintDiscountConfigManager();
            var package   = manager.GetPaintDiscountPackage(packageId);
            var userTypes = new List <bool>();

            switch (package?.UserType)
            {
            case (int)UserType.AllUser:
                userTypes.AddRange(new List <bool>()
                {
                    true, false
                }); break;

            case (int)UserType.NewUser:
                userTypes.Add(true); break;

            case (int)UserType.OldUser:
                userTypes.Add(false); break;

            default: break;
            }
            if (userTypes.Any())
            {
                result = regionIds.All(regionId => userTypes.All(isnew =>
                {
                    var cacheKey = $"PaintDiscountPackageRegion/{regionId}/{isnew}";
                    return(manager.RemovePaintRedisCache(cacheKey));
                }));
            }
            return(Json(new { Status = result, Msg = $"刷新缓存{(result ? "成功" : "失败")}" }
                        , JsonRequestBehavior.AllowGet));
        }
        /// <summary>
        /// 更新价格体系配置
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public ActionResult UpdatePackageConfig(PaintDiscountPackageModel model)
        {
            if (model == null || model.PKID < 1)
            {
                return(Json(new { Status = false, Msg = "未知的编辑对象" }, JsonRequestBehavior.AllowGet));
            }
            if (string.IsNullOrWhiteSpace(model.PackageName))
            {
                return(Json(new { Status = false, Msg = "活动名称不能为空" }, JsonRequestBehavior.AllowGet));
            }
            var manager = new PaintDiscountConfigManager();
            var isExist = manager.IsExistPaintDiscountPackage(model);

            if (isExist)
            {
                return(Json(new { Status = false, Msg = "已存在重复的数据,不能重复编辑" }, JsonRequestBehavior.AllowGet));
            }
            var user   = User.Identity.Name;
            var result = manager.UpdatePaintDiscountPackage(model, user);

            return(Json(new { Status = result, Msg = $"编辑{(result ? "成功" : "失败")}" }, JsonRequestBehavior.AllowGet));
        }
        /// <summary>
        /// 导出数据至Excel
        /// </summary>
        /// <returns></returns>
        public ActionResult ExportExcel(int packageId = 0)
        {
            var workbook = new XSSFWorkbook();
            var sheet    = workbook.CreateSheet();
            var row      = sheet.CreateRow(0);
            var cell     = null as ICell;
            var cellNum  = 0;

            row.CreateCell(cellNum++).SetCellValue("PID");
            row.CreateCell(cellNum++).SetCellValue("面数");
            row.CreateCell(cellNum++).SetCellValue("活动价");
            row.CreateCell(cellNum++).SetCellValue("权益名称");
            row.CreateCell(cellNum++).SetCellValue("活动说明");
            row.CreateCell(cellNum++).SetCellValue("活动图片");
            cellNum = 0;
            sheet.SetColumnWidth(cellNum++, 18 * 256);
            sheet.SetColumnWidth(cellNum++, 14 * 256);
            sheet.SetColumnWidth(cellNum++, 8 * 256);
            sheet.SetColumnWidth(cellNum++, 18 * 256);
            sheet.SetColumnWidth(cellNum++, 50 * 256);
            sheet.SetColumnWidth(cellNum++, 50 * 256);
            sheet.SetColumnWidth(cellNum++, 28 * 256);
            var manager     = new PaintDiscountConfigManager();
            var packageName = string.Empty;

            if (packageId > 0)
            {
                var package = manager.GetPaintDiscountPackage(packageId);
                if (package == null)
                {
                    return(Json(new { Status = false, Msg = "未知的喷漆打折价格体系" }, JsonRequestBehavior.AllowGet));
                }
                else
                {
                    packageName = package.PackageName;
                }
            }
            var result = manager.GetPaintDiscountDetailByPackageId(packageId);

            if (result != null && result.Any())
            {
                int modelRowCount = 1;
                foreach (var model in result)
                {
                    int modelCol = 0;
                    var modelRow = sheet.CreateRow(modelRowCount);
                    modelRow.CreateCell(modelCol++).SetCellValue(model.ServicePid);
                    modelRow.CreateCell(modelCol++).SetCellValue(model.SurfaceCount);
                    modelRow.CreateCell(modelCol++).SetCellValue((double)model.ActivityPrice);
                    modelRow.CreateCell(modelCol++).SetCellValue(model.ActivityName);
                    modelRow.CreateCell(modelCol++).SetCellValue(model.ActivityExplain);
                    modelRow.CreateCell(modelCol++).SetCellValue(model.ActivityImage);
                    modelRowCount++;
                }
            }
            var ms = new MemoryStream();

            workbook.Write(ms);
            return(File(ms.ToArray(), "application/x-xls",
                        $"喷漆打折价格体系{packageName}的服务价格配置 {DateTime.Now.ToString("yyyy年MM月dd日HH时mm分ss秒")}.xlsx"));
        }